O que é um Microcontrolador? Guia do estudante VERSÃO 3.0 GARANTIA Troca em decorrência de defeito funcional O consumidor terá, nos casos de vício ou defeito do produto, o prazo de até 90 dias para bens duráveis para solicitar a assistência técnica ou troca do mesmo. Se o produto adquirido apresentar defeito funcional, será feito o reparo ou a substituição do produto por outro igual ao descrito em sua nota fiscal. A BS Educacional tem até trinta (30) dias corridos, a contar da data do recebimento do seu produto em nossa fábrica. Após esse prazo, você poderá optar pela troca por outro produto similar, em perfeita condições de uso ou restituição corrigida do valor pago. Troca por conta de avaria no produto Se você receber o produto adquirido, avariado no transporte, será feita a substituição do produto avariado por outro produto igual ao descrito em sua nota fiscal. Preferencialmente recuse a entrega se notar que o mesmo encontra-se avariado. Caso contrário entre imediatamente em contato com a BS Educacional. Recebimento de produto em desacordo com o pedido Caso você receber um produto diferente do adquirindo, será feita a substituição desse produto por outro produto igual ao que foi solicitado no pedido. Se você detectar no ato da entrega que o produto está em desacordo com o que foi solicitado, recuse a entrega imediatamente e contate a BS Educacional. Caso contrário, o produto deverá ser devolvido sem manuseio, com todos os itens e acompanhado de cópia da nota fiscal. A troca do produto acontecerá somente após o recebimento e análise das condições do produto devolvido. GARANTIA DE 7 DIAS COM SEU DINHEIRO DE VOLTA Asseguramos o direto de devolução contemplado no código de defesa do consumidor que permite a desistência da compra no prazo de 7 dias a contar do ato de recebimento do produto. Se o prazo citado vencer em um dia não útil, será automaticamente prorrogado para o primeiro dia útil seguinte, não sendo aceitas solicitações realizadas além desse prazo. Para sua segurança, certifique-se que o produto recebido atende suas expectativas antes de violar a embalagem. Você poderá devolver o produto apenas se ele estiver em sua embalagem original, sem indícios de uso e com o manual e todos os acessórios que o acompanham. Constatada divergência, como utilização indevida, ausência de manual, acessório ou embalagem, a BS Educacional não poderá aceitar a devolução do produto. Para devolver o produto entre em contato com a BS Educacional explicando o motivo da devolução e informando o número do pedido ou Nota Fiscal. A BS Educacional enviará as instruções para o envio do produto a nossa fábrica. A troca do produto ou restituição do valor, excluindo custos de envio e manuseio, acontecerá somente após o recebimento e análise das condições do produto devolvido. Em compras pagas por meio de cartão de crédito, solicitaremos o respectivo estorno obedecendo o procedimento da administradora de cada bandeira. Em compras pagas por meio de boleto bancário, a restituição será creditada sempre na conta corrente de titularidade do cliente que efetuou a compra e em até dez (10) dias úteis a contar da data de confirmação que o produto devolvido atende os requisitos. DIREITOS AUTORAIS E MARCAS Esta documentação está protegida pela Leis de Direitos Autorais 2003-2009 pela Parallax Inc. Ao fazer o download ou obter uma cópia impressa desta documentação ou software, você concorda que é para uso exclusivo dos produtos Parallax. Quaisquer outros usos não são permitidos e podem representar uma violação de direitos autorais para Parallax, legalmente puníveis de acordo com as leis de direitos autorais e leis de propriedade intelectual. É expressamente proibido pela Parallax Inc. qualquer duplicação desta documentação para fins comerciais. A duplicação para uso educacional, no todo ou em parte, é permitida sujeita às seguintes condições: o material é permitido somente para ser usado em conjunto com produtos da Parallax, e o usuário pode reaver do aluno somente o custo da duplicação. Antes de duplicar quaisquer de nossas documentações, em parte ou na totalidade, para qualquer outro uso, faz-se necessário a aprovação da Parallax. BASIC Stamp, Board of Education, Boe-Bot, Stamps in Class, e SumoBot são marcas registradas da Parallax Inc. Assim como, HomeWorkBoard, PING))), Parallax, o logotipo da Parallax, Propeller e Spin. Se você desejar usar qualquer uma dessas palavras em seu material eletrônico ou impresso, você deve afirmar que é uma marca registrada da Parallax Inc. Outros nomes de marcas e produtos aqui mencionados são marcas comerciais ou marcas registradas de seus respectivos proprietários. ISBN 9781928982531 3.0.1-11.08.04-HKTP ISENÇÃO DE RESPONSABILIDADE A Parallax Inc. não é responsável por danos especiais, acidentais ou consequências, resultantes de qualquer violação da garantia, ou sob qualquer fundamento jurídico, inclusive lucros cessantes, tempo de inatividade, fundo de comércio, danos ou substituição de equipamentos ou propriedade, ou quaisquer custos de recuperação, reprogramação ou reprodução de quaisquer dados armazenados ou utilizados com produtos Parallax. A Parallax também não é responsável por qualquer dano pessoal, inclusive o de vida e saúde, resultante do uso de qualquer um dos nossos produtos. Você assume a responsabilidade total para a sua aplicação BASIC Stamp, não importando o risco de vida. ERRATA Apesar dos esforços para garantir a precisão dos nossos textos, os erros podem existir. Ocasionalmente uma folha de errata com uma lista de erros conhecidos e correções para um determinado texto será postada na página do produto relacionado na www.parallax.com. Se você encontrar um erro, por favor, envie um e-mail para [email protected] ou para [email protected]. Página - 5 Índice Analítico Prefácio ....................................................................................................................... 7 Sobre a versão 3.0 ......................................................................................................... 7 Público ............................................................................................................................ 7 Fóruns de Suporte .......................................................................................................... 8 Recursos para Educadores ............................................................................................ 8 Traduções em Linguas Extrangeiras .............................................................................. 9 Sobre o Autor.................................................................................................................. 9 Colaboradores Especiais ................................................................................................ 9 Capítulo 1: Introdução ............................................................................................. 11 Quantos Microcontroladores Você Viu Hoje? ............................................................... 11 BASIC Stamp 2 – Seu Novo Módulo Microcontrolador ................................................ 11 Invenções Incríveis com Microcontroladores Basic Stamp .......................................... 12 Hardware e Software .................................................................................................... 14 Atividade #1: Obtendo o Software ................................................................................ 14 Atividade #2: Usando a Ajuda Para Configuração do Hardware .................................. 19 Sumário ........................................................................................................................ 21 Capítulo 2: Luzes Acesas e Apagadas (On e Off) ................................................. 24 Luzes Indicadoras......................................................................................................... 24 Fazendo um Diodo Emissor de Luz (LED) Emitir Luz .................................................. 24 Atividade #1: Construindo e Testando um Circuito DE LED ........................................ 25 Atividade #2: Controle de ON/OFF com o BASIC Stamp ............................................. 31 Atividade #3: Contando e Repetindo ............................................................................ 36 Atividade #4: Construindo e Testando o Segundo Circuito DE LED ............................ 39 Atividade #5: Usando a Direção da Corrente para Controlar o LED Bicolor ................ 42 Sumário ........................................................................................................................ 48 Capítulo 3: Entrada Digital – Botões ...................................................................... 52 Encontrados em Calculadoras, Jogos Portáteis e Aplicativos...................................... 52 Recebimento vs. Envio de Sinais de HIGH e LOW ...................................................... 52 Atividade #1: Testando um Botão com um Circuito de LED......................................... 52 Atividade #2: Leitura do Botão com o BASIC Stamp................................................... 55 Atividade #3: Controle por Botão de um Circuito de LED............................................. 58 Atividade #4: Dois Botões Controlando Dois dos Circuitos de LED ............................. 61 Atividade #5: Teste de Tempo De Reação ................................................................... 65 Sumário ........................................................................................................................ 73 Capítulo 4: Controle de Movimento ........................................................................ 77 Movimento Microcontrolado.......................................................................................... 77 Sinais de On/Off e Movimentos do Motor ..................................................................... 77 Introduzindo o Servo..................................................................................................... 77 Atividade #1: Conectando e Testando o Servo ............................................................ 79 Atividade #2: Programa de Teste de Controle do Servo .............................................. 84 Atividade #3: Controle de Tempo de Espera do Servo ................................................ 93 Atividade #4: Controlando Posições com seu COMPUTADOR ................................... 98 Atividade #5: Convertendo Posição de Movimento .................................................... 105 Atividade #6: Servo Controlado Por Botão ................................................................. 108 Sumário ...................................................................................................................... 111 Capítulo 5: Medindo a Rotação ............................................................................. 116 Ajustando os Mostradores e Máquinas de Monitoramento ........................................ 116 O Resistor Variável Sob o Seletor - um Potenciômetro.............................................. 116 Atividade #1: Construindo e Testando o Circuito do Potenciômetro .......................... 117 Atividade #2: Medindo A resistência Ao medir o tempo ............................................. 119 Atividade #3: Lendo um Seletor com o BASIC Stamp................................................ 124 Atividade #4: Controlando o Servo com um Potenciômetro ....................................... 129 Sumário ...................................................................................................................... 136 Capítulo 6: Display Digital ..................................................................................... 140 O Display Digital Cotidiano ......................................................................................... 140 O Que é um Display de 7 Segmentos? ...................................................................... 140 Atividade #1: Construindo e Testando O Display de LED de 7 Segmentos ............... 141 Atividade #2: Controlando o Display de LED de 7 Segmentos .................................. 144 Página - 6 Atividade #3: Exibindo Dígitos .................................................................................... 146 Atividade #4: Exibindo a Posição de um Dial ............................................................. 152 Sumário ...................................................................................................................... 156 Capítulo 7: Medição de Luz ................................................................................... 160 Dispositivos que Contém Sensores de Luz ................................................................ 160 Introdução Do Fototransistor ...................................................................................... 162 Atividade #1: Construindo e Testando o Medidor de Luz ........................................... 163 Atividade #2: Rastreando Eventos de Luz.................................................................. 166 Atividade #3: Medições Gráficas de Luz (Opcional) ................................................... 173 Atividade #4: Simples Medidor de Luz ....................................................................... 175 Atividade #5: Saídas ON/OFF do Fototransistor ........................................................ 184 Atividade #6: Para Diversão - Meça a Luz Externa com um LED .............................. 191 Sumário ...................................................................................................................... 195 Capítulo 8: Frequência e Som ............................................................................... 200 O Seu Dia e Bips Eletrônicos ..................................................................................... 200 Microcontroladores, Alto-Falantes e Sinais On/Off..................................................... 200 Apresentando o Speaker Piezoelétrico ...................................................................... 200 Atividade #1: Criando e Testando o Alto-Falante ....................................................... 200 Atividade #2: Sons de Ação........................................................................................ 202 Atividade #3: Notas Musicais e Canções Simples...................................................... 207 Atividade #4: Música com Microcontrolador ............................................................... 211 Atividade #5: Toques com RTTTL .............................................................................. 222 Sumário ...................................................................................................................... 232 Capítulo 9: Construindo Blocos Eletrônicos ....................................................... 236 Esses Pequenos CHIPS Pretos ................................................................................. 236 Expanda Seus Projetos com Circuitos Periféricos Integrados ................................... 237 Atividade #1: Controle do Fluxo Atual com um Transistor.......................................... 237 Atividade #2: Introdução ao Potenciômetro Digital ..................................................... 240 Sumário ...................................................................................................................... 247 Capítulo 10: Protótipos De Suas Próprias Invenções ........................................ 252 Aplicando o que Você Sabe com Outras Peças e Componentes ............................. 252 Protótipo de um Micro Sistema de Segurança ........................................................... 253 Atividade #1: Da Ideia a Prova de Conceito ............................................................... 254 Atividade #2: Construir e Testar Cada Circuito Individualmente ................................ 256 Atividade #3: Organizar a Codificação de Tarefas em Pequenos Pedaços ............... 257 Atividade #4: Documentar o Seu Código!................................................................... 261 Atividade #5: Dê ao Seu App uma Surpreendente Nova Funcionalidade .................. 263 Atividade #6: Superando Obstáculos do Projeto ........................................................ 264 Atividade #7: Qual Será a Próxima?........................................................................... 269 Sumário ...................................................................................................................... 272 Apêndice A: Lista de Peças e Opções de Kit ...................................................... 274 Opções de Kit Completo ............................................................................................. 275 Apêndice B: Mais Informações Sobre Eletricidade ............................................ 278 Atividade Bõnus: Lei de Ohm, Voltagem e Corrente .................................................. 279 Apêndice C: Sumário do Formato RTTTL............................................................ 285 Página - 7 Prefácio Esse texto responde a pergunta “O que é o Microcontrolador”, mostrando aos alunos como eles podem projetar suas invenções de modo personalizado e inteligente com o módulo microcontrolador BASIC Stamp®. da Parallax Inc. As atividades deste texto incorporaram uma variedade de divertidas e interessantes experiências projetadas para trabalhar à imaginação do aluno, utilizando movimento, luz, som e feedback tátil para explorar novos conceitos. Essas atividades apresentam aos alunos uma série de princípios básicos nas áreas de programação de computadores, eletricidade e eletrônica, matemática e física. Muitas destas atividades facilitam a apresentação prática de projetos utilizados por engenheiros e técnicos na criação de máquinas e aparelhos modernos, usando peças genéricas baratas O que é um microcontrolador? é a porta de entrada de dados para os programas Stamps in Class. Para ver a série completa, que inclui títulos como Robótica com o Boe-Bot, sensores inteligentes e aplicações, controle de processos, e muito mais, visite www.parallax.com/Education. SOBRE A VERSÃO 3.0 Esta é a primeira revisão deste título desde 2004 cujas principais alterações incluem: • • • • A substituição do fotoresistor sulfureto de cádmio por um sensor de luz compatível com RoHs de um tipo que vai ser mais comum no design do produto daqui me diante. Isso exigiu revisões dos capítulos 7 e 10, e ajustes em outros capítulos. Aperfeiçoamento das atividades e ilustrações de controle do servo no Capítulo 4. Mover parte do capítulo 1 “Configurações e Testes", e os apêndices de hardware e solução de problemas para o arquivo de ajuda. Isso foi feito para suportar conexões de hardware Serial e USB, e outras conexões de programação em nossos produtos e na expansão de tecnologias. Isto também permite uma manutenção dinâmica do hardware e resolução de problemas. A remoção de referências para o CD Parallax, excluída de nosso kits, foi no intuito de redução e desperdício para garantir que os clientes possam baixar o mais recente software BASIC Stamp Editor e os drivers USB disponíveis para seus sistemas operacionais. Além disso, foram corrigidos pequenos artigos de errata notados na versão anterior (2.2). O material ainda aponta para os mesmos objetivos, e todos os conceitos de programação são os mesmos e os comandos são cobertos juntamente com alguns novos. Finalmente, para facilitar a utilização, os números das páginas foram alterados para a página em PDF e os números das páginas físicas são os mesmos para facilidade de utilização. PÚBLICO Este texto foi elaborado para ser uma porta de entrada para o aprendizado da tecnologia, e uma curva de fácil aprendizagem para implantação de programas e introdução de robótica. O texto é organizado para ser usado pelo maior e variado número de estudantes possível, bem como por alunos independentes. Estudantes do ensino médio podem experimentar os exemplos, neste texto, de uma forma guiada, basta seguir as instruções demarcadas com a supervisão do instrutor. Por outro lado, a compreensão dos alunos de pré-engenharia e habilidades para resolver problemas podem ser testadas com Página - 8 perguntas, exercícios e projetos (com soluções) em cada resumo de capítulo. O aluno independente pode trabalhar em seu próprio ritmo, e obter ajuda através dos fóruns Stamps in Class citados abaixo. FÓRUNS DE SUPORTE A Parallax mantém fóruns livres e moderados para nossos clientes, cobrindo uma variedade de temas: • Propeller Chip: para todas as discussões relacionadas com o microcontrolador Propeller multicore e ferramentas para desenvolvimento da linha de produtos. • BASIC Stamp: ideias de projetos, suporte e tópicos relacionados para todos os modelos BASIC Stamp da Parallax. • Microcontrollers SX: Assistência técnica para todos os chips SX, incluindo o compilador SX / B e a ferramenta SX-Key. • Sensors: Discussão relativa à ampla gama de sensores da Parallax, e interface entre os sensores com microcontroladores da Parallax. • Stamps in Class: estudantes, professores, clientes poderão discutir aqui materiais educativos e projetos escolares da Parallax. • Robotics: Para todos os robôs Parallax e robôs personalizados construídos com processadores e sensores da Parallax. • The Sandbox: Tópicos relacionados ao uso de produtos Parallax, somente, inespecífico para os outros fóruns. • Completed Projects: Publique aqui seus projetos concluídos, elaborados com os produtos da Parallax. • HYDRA System and Propeller Game Development: Discussão e assistência técnica para o kit de desenvolvimento de jogo HYDRA e programação de microcontrolador Propeller relacionado. RECURSOS PARA EDUCADORES Temos uma grande variedade de recursos neste texto elaborados para apoiar os educadores. Stamps in Class “Mini Projetos” Para complementar nossos textos, nós fornecemos um banco de projetos para a sala de aula. Projetado para envolver os alunos, cada “Mini Projeto" contém um completo código de fontes, explicações de "Como ele Funciona" (“How it Works”), esquemas e diagramas de fiação ou fotos para um dispositivo que o estudante poderá utilizar. Muitos projetos têm um vídeo introdutório, para promover o auto estudo nos alunos mais interessados em eletrônica e programação. Basta seguir o link Stamps in Class “Mini Projetos " (“Mini Projects”) na www.parallax.com/Education. Cursos para Educadores Estes cursos, práticos e intensivos, de 1 ou 2 dias, para educadores são ministrados por engenheiros da Parallax ou por professores experientes usando materiais educativos da Parallax em suas salas de aula. Para mais detalhes visite → Educators Courses. Fórum para Educadores da Parallax Neste fórum privado, gratuito, os educadores podem fazer perguntas e compartilhar suas experiências com o uso de produtos da Parallax em suas salas de aula. Aqui também são Página - 9 postados materiais educativos complementares. Para se inscrever, envie um e-mail para obter instruções para [email protected]; será necessário o envio de certificado de educador. Materiais Educativos Suplementares Selecione os textos educativos da Parallax para ter um conjunto inédito de questões e soluções postadas em nosso fórum para educadores (“Parallax Educators Forum”); convidamos os educadores a copiar e modificar esse material à vontade para a preparação rápida de lição de casa, questionários e testes. Aqui também podem ser publicadas apresentações em PowerPoint e material de teste preparados por outros educadores. Permissões de Direitos Autorais para Uso Educacional Não é necessário licença de instalação para o download, duplicação e instalação de software para uso educacional com produtos Parallax como é necessário em muitas escolas ou computadores domésticos. Nossos textos Stamps in Class e Manual BASIC Stamp estão disponíveis gratuitamente para downloads em PDF e podem ser reproduzidos, desde que seja para uso educacional, exclusivamente com produtos de microcontroladores Parallax e o estudante é cobrado não mais que o custo de duplicação. Os arquivos PDF não são fechados, possibilitando a seleção de textos e imagens para preparar apostilas, transparências ou apresentações do PowerPoint. TRADUÇÕES EM LINGUAS EXTRANGEIRAS Muitos de nossos textos Stamps in Class foram traduzidos para outras línguas, estes textos disponíveis para download gratuitamente e sujeitos a mesma permissão de direitos autorais para uso educacional como em nossas versões originais. Para ver a lista completa, clique nos links Tutorials & Translations em www.parallax.com / Education. Os textos foram preparados, em coordenação com o programa de tradutores voluntários da Parallax. Se você estiver interessado em participar do nosso programa de tradutor voluntário, envie um e-mail para [email protected]. SOBRE O AUTOR Andy Lindsay juntou-se a Parallax Inc. em 1999, e, desde então foi autor de oito livros e numerosos artigos e documentos de produtos para a empresa. As três últimas versões “Do que é um microcontrolador?” foram criadas e atualizadas com base em observações e comentários educativos que Andy coletou enquanto viajava pelo país e pelo exterior ministrando cursos educacionais em eventos. Andy estudou engenharia elétrica e eletrônica na Universidade Estadual da Califórnia, Sacramento, e é um autor que contribuiu para diversos trabalhos que abordam o tema de microcontroladores em préengenharia de currículos. Quando não está escrevendo material educativo, Andy faz engenharia de produto e aplicação para a Parallax. COLABORADORES ESPECIAIS A equipe da Parallax montada para preparar esta edição inclui: departamento de liderança e excelência por Aristides Alvarez; projeto aula e redação técnica por Andy Lindsay; a arte é coberta por Jen Jacobs; ilustrações gráficas por Rich Allred e Andy Lindsay; revisão técnica por Jessica Uelmen; sutilezas, edição e layout por Stephanie Lindsay. Agradecimentos especiais a Ken Gracey, fundador do Basic Stamp no Página - 10 programa Class, e Tracy Allen e Phil Pilgrim pela consulta na seleção do sensor de luz utilizado nesta versão que substitui o sulfureto de cádmio fotoresistor. Muitas pessoas, aos quais ainda estamos gratos, contribuíram com edições anteriores para o desenvolvimento do “O que é um Microcontrolador?”. A Parallax deseja agradecer novamente a Robert Ang por sua revisão inicial completa e detalhada e ao já falecido veterano engenheiro e estimado cliente Sid Weaver pela revisão criteriosa. Obrigado também aos autores de Stamps in Class Tracy Allen (Aplicação de Senhores) e Martin Hebel (Controle de Processos) por sua revisão e recomendações. Andy Lindsay agradece a seu pai Marshall e ao cunhado Kubilay pôr os seus conselhos musicais especializados e sugestões. Página - 11 Capítulo 1: Introdução QUANTOS MICROCONTROLADORES VOCÊ VIU HOJE? Um microcontrolador é um tipo de computador em miniatura que você pode encontrar em todos os tipos de dispositivos eletrônicos. Alguns exemplos de produtos cotidianos, têm microcontroladores embutidos e são mostrados na Figura 1- 1. Se eles têm botões e um visor digital, é possível que eles também tenham um cérebro microcontrolador programável. Figura 1-1 Exemplos cotidianos de dispositivos que contenham microcontroladores Tente fazer uma lista contando quantos dispositivos com microcontroladores que você usa em um dia normal. Aqui estão alguns exemplos: se o seu rádio relógio disparar de manhã e você apertar o botão “soneca” algumas vezes, a primeira coisa que você estará fazendo no seu dia é interagir com um microcontrolador. Aquecer um pouco de comida no forno de micro-ondas e fazer uma chamada em um telefone celular também envolvem interação com microcontroladores. Isso é apenas o começo. Aqui estão mais alguns exemplos: ligar a televisão com um controle remoto manual, jogos portáteis, usar uma calculadora. Todos esses dispositivos têm microcontroladores dentro deles que interagem com você. BASIC STAMP 2 – SEU NOVO MÓDULO MICROCONTROLADOR O módulo BASIC Stamp® 2 da Parallax Inc., mostrado na Figura 1- 2, tem um microcontrolador construído para ele, que é o chip preto mais largo. O resto dos componentes do módulo BASIC Stamp também é encontrado em aparelhos de consumo que você usa todos os dias. Juntos, eles são corretamente denominados sistema de computador embutido. Este nome é quase sempre abreviado como "sistema embutido". Esses módulos são, frequentemente, chamados de "microcontroladores". As atividades deste texto irão guiá-lo através da construção de circuitos semelhantes aos encontrados em eletrodomésticos e aparelhos de alta tecnologia. Você também escreverá programas de computador que o módulo BASIC Stamp irá executar. Estes programas farão o módulo BASIC Stamp monitorar e controlar esses circuitos para que eles executem funções úteis. Figura 1-2 Módulo Microcontrolador BASIC Stamp 2 Página - 12 Neste texto, "BASIC Stamp" refere-se ao módulo microcontrolador BASIC Stamp® 2. Projetado e fabricado pela Parallax Incorporated, o nome deste módulo é comumente abreviado para BS2, e é o primeiro da série de módulos apresentados na Figura 1- 3. Cada um dos outros módulos é um pouco diferente, com uma velocidade mais elevada, mais memória, e funções extras, ou algumas combinações destas características adicionais. Para maiores informações, siga o link "Compare BASIC Stamp modules" em www.parallax.com/BasicStamp. Figura 1-3 Modelos BASIC Stamp 2, da esquerda para a direita: BS2, BS2E, BS2SX, BS2P24, BS2P40, BS2pe, BS2px INVENÇÕES INCRÍVEIS COM MICROCONTROLADORES BASIC STAMP Aparelhos de consumo não são as únicas coisas que contêm microcontroladores. Robôs, máquinas, projetos aeroespaciais e outros dispositivos de alta tecnologia também são construídos com microcontroladores. Vamos dar uma olhada em alguns exemplos que foram criados com módulos BASIC Stamp. Os robôs foram projetados para fazer tudo, desde ajudar os alunos a aprender mais sobre microcontroladores, como cortar a grama, e resolver complexos problemas mecânicos. A Figura 1- 4 mostra um exemplo de dois robôs. Em cada um destes robôs, os alunos utilizam o BASIC Stamp 2 para ler sensores, controlar motores e para comunicação com outros computadores. O robô da esquerda é o robô Boe-Bot® da Parallax Inc. Os projetos do livro Robótica com o Boe-Bot podem ser resolvidos com o Boe-Bot, depois que você trabalhar com as atividades deste texto. O da direita é chamado de um submarino ROV (veículo operado remotamente) e foi construído e testado no Instituto MATE (Educação em Tecnologia Avançada da Marinha) pelos professores de verão. Os operadores veem na TV o que o ROV vê através de uma câmera de vídeo e podem controlá-lo com uma combinação de um controle manual e um laptop. Seu BASIC Stamp mede a profundidade e a temperatura, controla o motor de impulsão vertical, e troca informações com o laptop. O MATE coordena competições regionais e internacionais de ROV para estudantes de variados níveis, desde o ensino médio até a universidade. Figura 1-4 Robôs educacionais Robô Boe-Bot (à esquerda) e ROV no MATE pelos professores do Instituto de Verão (à direita, www.marinetech.org) Outros robôs resolvem problemas mais complexos, tais como o voo do robô autônomo de controle remoto mostrado no lado esquerdo da Figura 1-5. Este robô foi construído e testado por estudantes de engenharia mecânica na Universidade da Califórnia, em Irvine. Eles usaram um módulo BASIC Stamp para ajudá-los na comunicação com um sistema de posicionamento global por satélite (GPS), para que o robô pudesse saber a Página - 13 sua posição e altitude. O BASIC Stamp também lê o nível de sensores e controla os ajustes do motor para manter o robô voador corretamente. A centopeia robótica, à direita da Figura 1-5, foi desenvolvido por um professor da Universidade Técnica de Nanyang, de Singapura. Ele tem mais de 50 módulos BASIC Stamp a bordo, e todos eles se comunicam uns com os outros em uma elaborada rede que ajuda a controlar e orquestrar o movimento de cada conjunto de pernas. Robôs como esse, não só nos ajudam a entender melhor projetos na natureza como, eventualmente, podem ser usados para explorar locais distantes ou mesmo outros planetas. Figura 1-5 Robôs de pesquisa que contêm microcontroladores Voo do robô de controle remoto autônomo na UC Irvine (à esquerda) e do Projeto Centopeia na Universidade de Nanyang (à direita) Com a ajuda de microcontroladores, os robôs também podem assumir tarefas do dia-adia, tais como cortar a grama. O módulo BASIC Stamp dentro do cortador de grama mostrado na Figura 1-6 ajuda o robô a permanecer dentro dos limites da relva, e também lê os sensores que detectam obstáculos e controla os motores que o fazem mover. Figura 1-6 Módulo Microcontrolador BASIC Stamp 2 Microcontroladores são também utilizados em pesquisas científicas de alta tecnologia e projetos aeroespaciais. A estação meteorológica mostrada no lado esquerdo da Figura 17 é usada para coletar dados ambientais relacionados à degradação dos recifes de coral. O módulo BASIC Stamp dentro dos recifes de coral reúne dados a partir de uma variedade de sensores e armazena-os para posterior recuperação pelos cientistas. O submarino no centro é um veículo de exploração submarina, e seus propulsores, câmeras e luzes são todos controlados por microcontroladores BASIC Stamp. O foguete mostrado à direita fazia parte de uma competição para lançar um foguete de propriedade privada para o espaço. Ninguém ganhou o concurso, mas este foguete quase fez isso! O BASIC Stamp controlou quase todos os aspectos da sequência de lançamento. Página - 14 Figura 1-7 Exemplos de microcontroladores ambientais e aeroespaciais Coleta de dados ecológicos por Sistema EME (à esquerda), pesquisa submarina feita pelo Instituto Harbor Branch (centro), e lançamento de teste aeroespacial JP (à direita) De aparelhos domésticos comuns até aplicações científicas e aeroespaciais, você vai precisar do básico de um microcontrolador para iniciar projetos como estes introduzidos aqui. Ao trabalhar com as atividades deste livro, você vai começar a experimentar e aprender a usar uma variedade de blocos de construção encontrada em todas essas invenções de alta tecnologia. Você vai construir circuitos para displays, sensores e controladores de movimento. Você vai aprender como conectar esses circuitos para o módulo BASIC Stamp 2 e, em seguida, escrever programas de computador que o fazem controlar movimentos, exibir e coletar dados dos sensores. Ao longo do caminho, você vai aprender importantes conceitos e técnicas de informática e de programação eletrônica. Quando você estiver apto, poderá perceber sozinho, um meio de inventar um dispositivo para seu próprio projeto. HARDWARE E SOFTWARE Começar com módulos microcontroladores BASIC Stamp é semelhante a começar com um novo PC ou laptop. As primeiras coisas que a maioria das pessoas tem que fazer é tirá-lo da caixa, ligá-lo, instalar e testar alguns softwares, e talvez até mesmo escrever algum software próprio, usando uma linguagem de programação. Se esta é sua primeira vez usando um módulo BASIC Stamp, você vai fazer todas essas mesmas atividades. Se você estiver em aula, o hardware poderá já estar pronto para você. Se for este o caso, o professor pode ter outras instruções. Se não, este capítulo irá guiá-lo, passo a passo, para que o seu novo microcontrolador BASIC Stamp ligue e funcione. ATIVIDADE #1: OBTENDO O SOFTWARE O BASIC Stamp Editor (versão 2.5 ou superior) é o software que você vai usar na maioria das atividades e projetos neste texto. Você vai usar este software para escrever programas que o módulo BASIC Stamp executará. Você também pode usar este software para visualizar mensagens enviadas pelo BASIC Stamp que ajudam a entender o que ele capta. Requisitos do Sistema do Computador Você vai precisar de um computador pessoal para executar o software BASIC Stamp Editor. Seu computador precisa ter as seguintes características: • • • Microsoft Windows 2000 ou sistema operacional mais recente Porta Serial disponível ou porta USB Acesso à Internet e um navegador de Internet Página - 15 Baixar o Software a Partir da Internet É importante, se possível, usar sempre a versão mais recente do software BASIC Stamp Editor. O primeiro passo é ir até o site internacional da Parallax e baixar o software (em inglês), ou se preferir utilize o site da BS Educacional e procure por Suporte & Downloads (www.bseducacional.com.br). Usando um navegador da Web, vá para www.parallax.com/basicstampsoftware (Figura 1-8). Figura 1-8 Página de download do BASIC Stamp Editor no www.parallax.com/ basicstampsoftware Este é o local para fazer o download da versão mais recente do software, em inglês. Use o “Click Here to Download” para obter a versão mais recente do software BASIC Stamp Editor Windows (Figura 1-9). Figura 1-9 Página de download do software BASIC Stamp Editor. Clique no botão para começar o download. A janela de download do arquivo será aberta, perguntando se você deseja executar ou salvar este arquivo (Figura 1- 10). Clique em Salvar. Página - 16 Figura 1-10 Janela do arquivo de download Clique em Salvar (Save) e salve o arquivo no seu computador. Use o campo Salvar em (Save in) para escolher o local em seu computador onde o arquivo de instalação será salvo, em seguida, clique no botão Salvar (Figura 111). Figura 1-11 Janela Salvar como (Save as) Escolha um local em seu computador para salvar o software de instalação, então clique em Salvar (Save). Quando o download terminar, clique em Executar (Figura 1-12.) Siga as instruções que aparecem. Ao aparecer mensagens do sistema operacional pedindo para confirmar se você deseja continuar com a instalação, concorde. Figura 1-12 Baixe a mensagem completa Clique em Executar (Run). Se for solicitado, sempre confirme que deseja continuar. Será aberta uma janela do instalador BASIC Stamp Editor (Figura 1-13). Clique em Avançar e siga as instruções, aceitando todos os padrões. Página - 17 Figura 1-13 Janela do instalador do BASIC Stamp Editor Clique em avançar (Next) IMPORTANTE: Quando a mensagem “Instalar o Drive USB” (Install USB Driver) for exibida (Figure 1-14), assinale a opção instalar automaticamente / atualizar o driver (recomendado) e clique em Avançar. Figura 1-14 Mensagem de instalação do drive USB Deixe a caixa marcada e clique em Avançar (Next). Quando a mensagem "Pronto para iniciar a Instalação” (Ready to Install the Program) aparecer (Figura 1-15), clique no botão Instalar. Uma barra de progresso pode aparecer, e isso pode levar alguns minutos. Página - 18 Figura 1-15 Pronto para iniciar a instalação Clique em instalar (Install) para avançar. Neste ponto, uma janela adicional pode aparecer atrás da janela atual, enquanto os drivers USB estão sendo atualizados. Esta janela fechará automaticamente, quando a instalação do driver for concluída. Caso você não veja esta janela, não significa que há problemas. Sobre os drivers USB. Os drivers USB instalados com o BASIC Stamp Windows Editor são, por padrão, necessários para usar qualquer hardware Parallax conectado à porta USB do seu computador. VCP significa em inglês porta virtual COM e vai permitir que a porta USB do seu computador seja tratada como uma porta serial padrão RS232 pelo hardware Parallax. Controladores USB para diferentes sistemas operacionais. Os drivers USB VCP inclusos no software BASIC Stamp Windows Editor são somente para determinadas versões do sistema operacional Windows. Para maiores informações, visite o site www.parallax.com/usbdrivers. Quando a janela informar que a instalação foi concluída com sucesso, clique em Concluir (Finish) (Figura 1-16). Figura 1-16 Instalação do BASIC Stamp Editor concluída Clique em Concluído (Finish). Página - 19 ATIVIDADE #2: USANDO A AJUDA PARA CONFIGURAÇÃO DO HARDWARE Nesta seção você vai executar o arquivo de Ajuda do BASIC Stamp Editor. Dentro do arquivo de Ajuda você vai aprender sobre as diferentes placas de programação BASIC Stamp, disponíveis para os programas Stamps in Class e determinar qual delas você está usando. Então, você vai seguir os passos da ajuda para conectar o seu hardware ao seu computador e testar o seu sistema de programação BASIC Stamp. Executando o Editor do BASIC Stamp pela primeira vez Se você ver o ícone do BASIC Stamp Editor no seu desktop, clique duas vezes nele (Figura 1-17). Ou, clique no menu Iniciar do seu computador, em seguida selecione Programas Parallax Inc BASIC Stamp Editor 2.5 BASIC Stamp Editor 2.5. Figura 1-17 BASIC Stamp Editor Desktop Icon Dê um duplo clique para iniciar o programa. Na barra de ferramentas do BASIC Stamp Editor clique em Ajuda (Help) na barra de ferramentas (Figura 1-18) e selecione BASIC Stamp Help. Figura 1-18 Abrindo o menu Ajuda (Help) Clique Ajuda (Help), e escolha o BASIC Stamp Help a partir do menu drop-down. Página - 20 Figura 1-19: Menu Ajuda do BASIC Stamp Editor Clique no link “Começando com Stamps in Class” (“Getting Started with Stamps in Class”) na parte inferior da página Bem-vindo (Welcome) como mostrado no canto inferior direito da Figura 1-19. Seguindo as Instruções do Arquivo de Ajuda (HELP) A partir daqui, você vai seguir as instruções do arquivo de Ajuda para completar estas tarefas: • • • • • • Identificar qual placa de desenvolvimento BASIC Stamp você está usando Ligar sua placa de desenvolvimento ao seu computador Testar sua conexão de programação Solucionar problemas de sua conexão de programação, se necessário Escrever seu primeiro programa PBASIC para seu BASIC Stamp Desligar seu hardware quando terminar Quando você tiver concluído as atividades no arquivo de Ajuda, retorne para o livro e continue com o sumário abaixo antes de passar para o Capítulo 2. Página - 21 O que eu faço se eu ficar preso em alguma parte? Se você tiver problemas ao seguir as instruções neste livro ou no arquivo Ajuda, você tem muitas opções para obter suporte técnico gratuito: • Fóruns: inscreva-se e poste uma mensagem gratuitamente para nós no fórum Stamps in Class em forums.parallax.com (em inglês) ou na Central de Aprendizado da BS Educacional (www.bseducacional.com.br). • E-mail: mande um e-mail para [email protected] ou [email protected] para suporte em português. • Telefone: Brasil – ligue para (011) 2533-9478 ou Estados Unidos - +1 888-99-STAMP (888 997-8267). Ou outros ligue para (916) 624-8333. • Mais recursos: Visite www.parallax.com/support www.bseducacional.com.br/Central de Aprendizado ou SUMÁRIO Este capítulo guiou você através do seguinte: • Uma introdução a alguns dispositivos que contêm microcontroladores • Introdução ao módulo BASIC Stamp • Tour por algumas invenções interessantes feitas com módulos BASIC Stamp • Onde obter o software gratuito BASIC Stamp Editor que você vai usar em praticamente todas as experiências neste texto • Como instalar o software BASIC Stamp Editor • Como usar o módulo BASIC Stamp, Board of Education, e HomeWork Board • Como configurar o hardware BASIC Stamp • Como testar seu software e hardware • Como escrever e executar um programa PBASIC • Usando os comandos DEBUG e END • Usando o CR caractere de controle e DEC formatador • Breve introdução ao código ASCII • Como desligar a alimentação do seu Board of Education e HomeWork Board quando terminar suas atividades. Questões 1. Que é o microcontrolador? 2. BASIC Stamp é um módulo microcontrolador, ou ele contém um? 3. Que pistas você procuraria para descobrir se um aparelho como um rádio relógio ou um telefone celular contém um microcontrolador? 4. Que significa um apóstrofo no início de uma linha de um código em um programa PBASIC e o que esse código significa? 5. Que comandos PBASIC você aprendeu neste capítulo? 6. Vamos dizer que você queira fazer uma pausa em seu projeto BASIC Stamp para ir fazer um lanche, ou talvez você queira dar uma pausa maior e retornar somente após alguns dias. O que você faria antes desta pausa? Exercícios 1. Explique o significado do asterisco neste comando: DEBUG DEC 7 * 11 Página - 22 2. Adivinhe o que o Debug Terminal iria mostrar se você executasse este comando: DEBUG DEC 7 + 11 3. Existe um problema com esses dois comandos. Quando você executa o código, os números que aparecem estão travados, parecendo assim que há um grande número em vez de dois pequenos. Deve-se modificar esses dois comandos para que as respostas apareçam em linhas diferentes no DEBUG Terminal. DEBUG DEC 7 * 11 DEBUG DEC 7 + 11 Projetos 1. Use o DEBUG para mostrar a solução do problema de cálculo: 1 + 2 + 3 + 4. 2. Salve seu primeiro programa YourTurn.bs2 com um outro nome. Se você colocasse o comando DEBUG mostrado na linha abaixo antes do comando END, que outras linhas você poderia deletar e ainda assim tê-lo funcionando? Modifique a cópia do programa para testar as suas hipóteses (sua previsão do que irá acontecer). DEBUG "Quanto é 7 X 11?", CR, " A resposta é: ", DEC 7 * 11 Soluções Q1. Um microcontrolador é um tipo de computador em miniatura encontrado em produtos eletrônicos. Q2. O módulo BASIC Stamp contém um chip microcontrolador. Q3. Se o aparelho tem botões e um visor digital, é um bom indício de que ele tenha um microcontrolador dentro dele. Q4. Um comentário. Q5. DEBUG e END Q6. Desligue a energia do projeto BASIC Stamp. Isto multiplica os dois operadores 7 e 11, resultando 77. O asterisco é o operador de multiplicação. O DEBUG Terminal iria mostrar: 18 Para solucionar o problema, acrescente o comando de controle CR seguido de uma vírgula. DEBUG DEC 7 * 11 DEBUG CR, DEC 7 + 11 P1. Aqui está um programa para a solução do cálculo matemático: 1 +2 +3 +4. ' O que é um microcontrolador? - Ch01Prj01_Add1234.bs2 '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Quanto é 1+2+3+4?" DEBUG CR, "A resposta é: " DEBUG DEC 1+2+3+4 END Página - 23 P2. As ultimas três linhas do DEBUG podem ser deletadas. Um adicional CR será preciso depois da mensagem “Olá” ("Hello"). ' O que é um microcontrolador? - Ch01Prj02_ FirstProgramYourTurn.bs2 ' BASIC Stamp mandará a mensagem para o Debug Terminal. ' {$STAMP BS2} ' {$PBASIC 2.5} DEBUG "Olá, sou eu” (Hello, it is me”), seu BASIC Stamp!” CR DEBUG " Quanto é 7 X 11?", CR, "A resposta é: ", DEC 7 * 11 END A saída do DEBUG Terminal é: Olá, sou eu, seu BASIC Stamp! Quanto é 7 X 11? A resposta é: 77 Esta saída é a mesma do código anterior. Este é um exemplo do uso de vírgulas para produzir uma grande quantidade de informações, usando apenas um comando DEBUG com vários elementos nele. Página - 24 Capítulo 2: Luzes Acesas e Apagadas (On e Off) LUZES INDICADORAS Luzes indicadoras são tão comuns que a maioria das pessoas tendem a não dar-lhes muita atenção. A Figura 2-1 mostra três luzes indicadoras em uma impressora a laser. Dependendo de qual luz está acesa, a pessoa que usa a impressora sabe se ela está funcionando corretamente ou não. Aqui estão apenas alguns exemplos de dispositivos com luzes indicadoras: aparelhos de som de automóveis, televisores, aparelhos de DVD, discos rígidos, impressoras e painéis de controle do sistema de alarme. Figura 2-1 Luzes indicadoras Luzes indicadoras são comuns em muitos dispositivos diários. Tornar uma luz indicadora on e off é uma simples questão de ligar e desligar a partir de uma fonte de energia. Em alguns casos, a luz indicadora está ligada diretamente à bateria ou a fonte de alimentação, como no indicador de alimentação no Board of Education. Outras luzes indicadoras são ligadas e desligadas por um microcontrolador dentro do dispositivo. Este é o status das luzes indicadoras que indicam o que o aparelho está fazendo. FAZENDO UM DIODO EMISSOR DE LUZ (LED) EMITIR LUZ A maioria das luzes indicadoras que você vê nos dispositivos é chamada de diodos emissores de luz. Você, frequentemente, verá em livros e diagramas de circuitos, um diodo emissor de luz abreviado pelas letras LED. O nome geralmente é pronunciado como três letras: "L-E-D". Você pode construir um circuito de LED, ligá-lo a energia, e o LED emitirá luz. Se você desligar a energia do circuito de LED ele cessará de emitir de luz. Um circuito de LED pode ser ligado ao BASIC Stamp, e o BASIC Stamp pode ser programado para ligar e desligar a alimentação do circuito de LED. Isto é muito mais fácil do que mudar manualmente a fiação do circuito ou ligar e desligar a bateria. O BASIC Stamp também pode ser programado para fazer o seguinte: • • • • Acender e apagar os LEDs de um circuito em ritmos diferentes Acender e apagar os LEDs de um circuito um número específico de vezes Controlar mais de um circuito de LED Controlar a cor de um circuito de LED bicolor (duas cores) Página - 25 ATIVIDADE #1: CONSTRUINDO E TESTANDO UM CIRCUITO DE LED É importante testar os componentes individualmente, antes de construí-los em um sistema maior. Esta atividade se concentra na construção e teste de dois circuitos de LED diferentes. O primeiro circuito é o que faz com que o diodo emissor de luz emita luz. O segundo circuito é o que faz com que ele não emita luz. Na atividade que vem depois desta primeira, você vai construir o circuito de LED em um sistema maior, ligando-o ao BASIC Stamp. Então você vai escrever programas que fazem o BASIC Stamp provocar o LED a emitir ou não luz. Nos primeiros testes de cada circuito de LED você só vai ter certeza de que ele está funcionando se conectá-lo a um BASIC Stamp. Apresentando o Resistor Um resistor é um componente que "resiste" ao fluxo de eletricidade. Este fluxo de eletricidade é chamado de corrente. Cada resistor tem um valor que mostra o quanto ele resiste ao fluxo de corrente. Este valor de resistência é chamado de ohm, e o sinal para o ohm é a letra grega ômega: Ω. Mais tarde, neste livro você verá o símbolo kΩ, ou seja, “kilo-ohm”, ou mil ohms. O resistor que você estará trabalhando nesta atividade é o resistor 470 Ω mostrado na Figura 2-2. A resistência tem dois fios (chamados de “leads” e pronuncia-se "liids"), cada um saindo de uma extremidade. Há um caixa de cerâmica entre os dois terminais, é a parte que resiste à passagem da corrente. A maioria dos diagramas de circuitos que mostram resistências usam o símbolo que está representado abaixo, do lado esquerdo, com as linhas em zig-zag para informar a pessoa que na montagem do circuito ela deverá usar um resistor de 470 Ω. Isto é chamado de “símbolo esquemático”. O desenho da direita é um desenho da peça utilizada em alguns de nossos produtos de nível iniciante, em textos Stamp in Class para ajudar a construir circuitos. Gold Silver or Blank 470 Ω Yellow Violet Brown Figura 2-2 Desenho de um resistor de 470 Ω Símbolo Esquemático (à esquerda) e o desenho (à direita) Os resistores que estamos usando nesta atividade têm listras coloridas que indicam quais são os valores de resistência. Há uma combinação de cor diferente para cada valor de resistência. Por exemplo, o código de cores para a resistência de 470 Ω é amarelovioleta-marrom. Pode haver uma quarta faixa que indica a tolerância do resistor. A tolerância é medida em porcentagem, e mostra a distância que a resistência real está da resistência rotulada. A quarta faixa pode ser dourada (5%), prateada (10%) ou sem tarja (20%). Para as atividades deste livro, a tolerância de um resistor não importa, mas sim o seu valor. Cada barra de cores que informa o valor do resistor corresponde a um dígito, e essas cores/dígitos estão listados na Tabela 2-1. A Figura 2-3 mostra como usar cada barra de cor com a tabela para determinar o valor de um resistor. Página - 26 Tabela 2-1 Cores do Resistor e Código Valores Dígito Cor 0 1 2 3 4 5 6 7 8 9 Preto Marrom Vermelho Laranja Amarelo Verde Azul Violeta Cinza Branco Tolerance Code First Digit Number of Zeros Second Digit Figura 2-3 Tabela de cores do resistor Aqui está um exemplo que mostra como a Tabela 2-1 e a Figura 2-3 podem ser usadas para descobrir o valor de um resistor, provando que o amarelo-violeta-marrom é realmente 470 Ω: • • • A primeira faixa é amarela, o que significa que o dígito mais à esquerda é um 4. A segunda faixa é violeta, o que significa que o próximo dígito é 7. A terceira faixa é marrom. Se marrom é 1, significa que apenas um zero deverá ser adicionado à direita dos dois primeiros números. amarelo-violeta-marrom= 4-7-0 = 470 Ω. Apresentando o LED Um diodo é uma válvula de uma via de corrente, e um diodo emissor de luz (LED) emite luz quando a corrente passa através do mesmo. Ao contrário dos códigos de cores em um resistor, a cor do LED, apenas diz-lhe qual a cor que vai brilhar quando a corrente passar por ele. As marcas importantes em um LED estão contidas na sua forma. Uma vez que um LED é uma válvula unidirecional, você deve conectá-lo da maneira correta, ou não funcionará como previsto. A Figura 2-4 mostra o símbolo esquemático de um LED e o desenho da peça. Um LED tem dois terminais. Um é chamado de “ânodo”, e o outro é chamado de “cátodo”. Nesta atividade, você vai ter que construir o LED em um circuito, e você deve prestar atenção e certificar-se de que as ligações de ânodo e cátodo estão conectadas ao circuito de forma adequada. No desenho da peça, o ânodo é rotulado com o sinal de mais (+). No símbolo esquemático, o ânodo é a parte larga do triângulo. Neste desenho da peça, o cátodo é o pino que não está marcado, e no símbolo esquemático, o cátodo é a linha sobre o triângulo. Página - 27 Figura 2-4 Desenho da peça e símbolo esquemático do LED Desenho da peça (acima) e símbolo esquemático (abaixo). Nos desenhos daqui em diante, o LED apresentará um “+” ao lado da perna do ânodo. + LED Quando você começar a construir seu circuito, não se esqueça de verificar se ele está de acordo com o símbolo esquemático e o desenho da peça. Observe no desenho da peça os diferentes comprimentos do LED. O condutor longo é ligado ao ânodo do diodo emissor de luz, e o mais curto é ligado ao seu cátodo. E também, se você olhar com atenção para a parte plástica do LED, é possível ver uma parte plana próxima a perna mais curta que informa que esse é o cátodo. Isso realmente vem a calhar se os fios forem cortados com o mesmo comprimento. Peças Para Teste do Circuito de LED (1) LED – verde (1) Resistor – 470 Ω (amarelo-violeta-marrom) Identificar as peças: Além dos desenhos de peças na Figura 2-2 e Figura 2-4, você pode usar a foto na última página do livro para ajudar a identificar as peças do kit, necessárias para esta e todas as outras atividades. Construindo o Circuito de Teste do LED Você irá construir um circuito, ligando os fios do LED e uma resistência, a pequenos orifícios denominados soquetes na área de prototipagem mostrada na Figura 2-5. Esta área de prototipagem tem soquetes pretos na parte superior e no lado esquerdo. Os soquetes pretos no topo têm os seguintes rótulos sobre eles: Vdd (+5 V), Vin (Tensão desregulada direto da sua bateria ou fonte de alimentação) e Vss (0 V, também chamado de terra). Estes são chamados terminais de potência, e serão usados para fornecer eletricidade a seus circuitos. Os soquetes pretos à esquerda têm rótulos como P0, P1 a P15. Estes soquetes serão usados para ligar o circuito de entrada/saída dos pinos do módulo BASIC Stamp. Página - 28 Vdd X3 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vin Vss Figura 2-5 Área de prototipagem Terminais de alimentação (soquetes pretos no topo), Acesso dos pinos de I/O (soquetes pretos na lateral), e placa de montagem sem solda (soquetes brancos) Pinos de entrada/saída são geralmente chamados de pinos de I/O; depois de ligar seu circuito a um ou mais desses pinos de I/O, você pode programar o BASIC Stamp para monitorar o circuito (entrada) ou enviar sinais on ou off para o circuito (output). Na próxima atividade você vai tentar isto. A placa de montagem branca com vários furos, é chamada de protoboard livre de soldas. Você usará o protoboard para conectar componentes uns aos outros e construir circuitos. Esta placa tem17 linhas de soquetes. Cada linha contém dois grupos de cinco soquetes separados por um pequeno vão. Todos os soquetes num grupo de 5 estão conectados. Então, se você ligar dois fios no grupo de 5 soquetes, eles vão fazer o contato elétrico. Por outro lado, dois fios na mesma linha, mas em lados opostos do vão, não serão ligados. Muitos dispositivos são projetados para serem conectados em soquetes separados pelo vão, como, por exemplo, o botão que vamos usar no Capítulo 3. Mais sobre placas: Para saber mais sobre a história das placas, como as placas modernas são construídas e como usá-las, consulte os recursos de vídeo no link www.parallax.com/go/WAM. A Figura 2-6 mostra um diagrama esquemático do circuito, e uma figura de como o circuito deve parecer quando ele é construído no protoboard. Cada grupo de 5 soquetes pode conectar até cinco ligações, ou fios, uns aos outros. Para este circuito, o resistor e o LED estão ligados, pois cada um tem um fio ligado ao mesmo grupo 5 de soquetes. Note que um fio do resistor é ligado a VDD (+5 V) de modo que o circuito possa obter energia. O outro fio de resistência é ligado ao fio do ânodo do diodo emissor de luz. O fio do cátodo do diodo emissor de luz é ligado a Vss (0 V, terra) completando o circuito. Agora você está pronto para construir o circuito mostrado na Figura 2- 6 (abaixo), ligando os fios de LED e resistor em soquetes na área de prototipagem. Siga estes passos: Desligue a energia do Board of Education ou do HomeWork Board. Use a Figura 2-4 para decidir qual fio está ligado ao cátodo do diodo emissor de luz. Procure o fio mais curto e a parte plana na parte plástica do LED. Ligue o cátodo do LED em um dos soquetes pretos rotulados “Vss” na área de prototipagem. Ligue o ânodo do LED (o outro fio mais longo) no soquete mostrado no protoboard. Página - 29 Ligue um dos fios do resistor ao mesmo grupo de 5 soquetes como no ânodo do LED. Isto irá ligar os dois fios juntos. Ligue outro fio do resistor em um dos soquetes rotulado “Vdd”. A direção importa para o LED, mas não para o resistor. Se você conectar o LED da maneira incorreta, ele não emitirá luz quando a energia for ligada. A resistência apenas resiste ao fluxo de corrente. Não existe para trás ou para frente em um resistor. Reconecte a energia do Board of Education ou do HomeWork Board. Cheque para ter certeza se o seu LED verde está emitindo luz. Ele deverá estar emitindo luz verde. Vdd Vdd X3 470 Ω LED Vss P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vin Vss + Figura 2-6 LED acesso, ligado diretamente a energia Esquemático (esquerda) e Diagrama de fiação (direita). Note-se que um fio do resistor e do ânodo do LED verde estão conectados no mesmo grupo de 5 soquetes. Isto liga eletricamente os dois componentes. Se o LED verde não emite luz quando você ligar a energia da placa: Alguns LEDs são mais brilhantes quando visto de cima. Tente olhar para baixo estando logo acima do corpo plástico do LED. Se a sala for muito clara, tente apagar algumas luzes, ou usar as mãos para projetar uma sombra sobre o LED. Se você ainda não viu nenhuma luz verde, experimente estes passos: Verifique novamente se cátodo e o ânodo do LED estão conectados corretamente. Se não, basta remover o LED, girá-lo 180º, e ligá-lo novamente. O LED não será afetado se você ligá-lo ao contrário, somente não emitirá luz. Quando você ligar o LED na direção certa, ele deverá emitir luz. Verifique novamente se você construiu seu circuito exatamente como mostrado na Figura 2-6. Se você estiver usando um kit que alguém usou antes de você, o LED pode estar danificado, então tente um diferente. Se você estiver em uma aula de laboratório, peça ajuda para o seu instrutor. Ainda está empacado? Experimente estes recursos gratuitos on-line: Visite os fóruns Stamps In Class: Se você não tiver um instrutor ou amigo que possa lhe ajudar, você pode sempre checar no fórum Stamps in Class no link http://forums.parallax.com. Se você não tirar suas dúvidas lá, você poderá contatar o departamento de Suporte Técnico Parallax, seguindo o link suporte (Support) no site www.parallax.com. Página - 30 Como Funciona o Teste do Circuito LED Os terminais Vss e Vdd fornecem pressão elétrica da mesma maneira que uma bateria faria. As tomadas Vdd são como terminal positivo da bateria, e os soquetes de VSS, são como terminais negativos da bateria. A Figura 2-7 mostra como é a aplicação de pressão a um circuito elétrico através de uma bateria e o que faz com que elétrons fluam através dele. Este fluxo de elétrons é chamado de corrente elétrica, ou apenas corrente. A corrente elétrica é limitada pela resistência. Esta corrente faz com que o diodo emita luz. + _ --- - N--N N - - - N N +++ +++ +++ Figura 2-7 Fluxo de elétrons em um circuito de LED - N + + = N - - - - - - - - - Os sinais de menos com os círculos em torno deles são utilizados para mostrar os elétrons fluindo do terminal negativo da bateria ao terminal positivo. Reações químicas dentro da bateria alimentam o circuito com fornecimento de corrente. O terminal negativo da bateria contém um composto que tem moléculas com elétrons extras (mostrado na Figura 2-7 por sinais de menos). O terminal positivo da bateria tem um composto químico que tem moléculas com elétrons a menos (mostrado por sinais de mais). Quando um elétron deixa uma molécula no terminal negativo e viaja através do fio, é chamado de elétron livre (também mostrado por sinal de menos). A molécula que perdeu o elétron extra não tem mais uma carga extra negativa, agora chamada de neutra (indicado por um N). Quando um elétron alcança o terminal positivo, ele se junta a molécula com elétrons a menos, e agora aquela molécula se torna neutra também. A Figura 2-8 mostra como o fluxo de eletricidade através do circuito de LED é descrito usando a notação esquemática. A pressão em todo o circuito elétrico é chamada de tensão. Os sinais + e - são usados para mostrar a tensão aplicada a um circuito. A seta mostra a corrente que flui através do circuito. Esta seta é quase sempre mostrada apontando para a direção oposta do fluxo real de elétrons. Benjamin Franklin não acreditava, pois não tinha conhecimento sobre elétrons, quando ele decidiu representar o fluxo de corrente de carga que passa do positivo para o terminal negativo de um circuito. Quando os físicos descobriram a verdadeira natureza da corrente elétrica, a convenção já estava bem estabelecida. Voltage + Vdd Resistance Figura 2-8 LED aceso, circuito esquemático mostrando tensão convencional e fluxo de corrente Current LED Voltage - Vss Os sinais + e - mostram a tensão aplicada ao circuito, e a seta mostra o fluxo de corrente através do circuito. Página - 31 Um desenho esquemático (como na Figura 2-8) é uma imagem que explica como um ou mais circuitos são ligados. Esquemas são usados por estudantes, entusiastas da eletrônica, eletricistas, engenheiros e praticamente todos que trabalham com circuitos. Apêndice B: Mais sobre eletricidade – este apêndice contém alguns termos do glossário e uma atividade que você pode tentar para se familiarizar mais com as medições de tensão, corrente e resistência. Sua Vez – Modificando o Teste do Circuito LED Na próxima atividade, você vai programar o BASIC Stamp para ligar o LED, em seguida, desligá-lo e ligá-lo novamente. O BASIC Stamp vai fazer isso para mudar o circuito de LED entre duas conexões diferentes, Vdd e Vss. Você terminará seu trabalho com circuitos quando o resistor estiver ligado a VDD e o LED emitir luz. Faça as alterações apresentadas na Figura 2-9 para verificar se o LED será desligado (não emite luz) quando a ligação do resistor for desconectada do Vdd e conectada a VSS. Desligue a energia do Board of Education ou do HomeWork Board. Desligue o fio do resistor que está ligado no soquete Vdd, e ligue-o a um soquete Vss como mostrado na Figura 2-9. Reconecte a energia do Board of Education ou do HomeWork Board. Verifique se o LED verde não está emitindo luz. Não deverá estar brilhando a luz verde. Por que os LEDs não brilham? Uma vez que ambas as extremidades do circuito estão ligadas à mesma tensão (Vss), não há qualquer pressão em todo o circuito elétrico. Assim, nenhuma corrente flui através do circuito e o LED permanece desligado. Vdd X3 470 Ω Vss LED Vss P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vin Vss + Figura 2-9 Circuito de LED Apagado Esquemático (esquerda) e diagrama de fiação (direita). ATIVIDADE #2: CONTROLE DE ON/OFF COM O BASIC STAMP Na Atividade #1, dois circuitos foram construídos e testados. Um circuito fez o LED emitir luz enquanto o outro não. Figura 2-10 mostra como o BASIC Stamp pode fazer a mesma coisa se você conectar um circuito de LED a um de seus pinos de I/O. Nesta atividade, você vai ligar o circuito de LED para o BASIC Stamp e programá-lo para Página - 32 ligar o LED on e off. Você também vai experimentar com programas que fazem o BASIC Stamp fazer isso em velocidades diferentes. SOUT 1 24 VIN SIN 2 23 VSS RES ATN 3 22 RES VDD (+5V) VSS 4 21 VDD (+5V) 20 P15 19 P14 18 P13 SOUT 1 24 VIN SIN 2 23 VSS ATN 3 22 VSS 4 21 20 P15 P0 5 19 P14 P1 6 18 P13 P2 7 BS2 Vdd BS2 Vdd P0 5 P1 6 P2 7 P3 8 17 P12 P3 8 17 P12 P4 Vss Vss 9 16 P11 P4 9 16 P11 P5 10 15 P10 P5 10 15 P10 P6 11 14 P9 P6 11 14 P9 P7 12 13 P8 P7 12 13 P8 O BASIC Stamp pode ser programado para ligar internamente a entrada do circuito de LED para VDD ou VSS. BS2-IC BS2-IC Figura 2-10 BASIC Stamp Comutação Existem duas grandes diferenças entre mudar a conexão manualmente e deixando o BASIC Stamp fazer isso. Primeiro, o BASIC Stamp não tem que cortar a energia da placa de alimentação, quando se muda a alimentação do circuito de LED de Vdd para Vss. Em segundo lugar, enquanto um ser humano pode fazer essa mudança várias vezes por minuto, o BASIC Stamp pode fazê-la milhares de vezes por segundo! Peças de Teste do Circuito de LED As mesmas da Atividade #1. Conectando o Circuito de LED ao BASIC Stamp O circuito de LED mostrado na Figura 2-11 é ligado quase do mesmo modo que o circuito no exercício anterior. A diferença é que o fio do resistor que foi trocado manualmente entre Vdd e Vss está agora ligado a um pino de I/O do BASIC Stamp. Desconecte a energia do Board of Education ou do HomeWork Board. Modifique o circuito que você estava trabalhando na Atividade #1 para que ele corresponda ao da Figura 2-11. Vdd P14 X3 470 Ω LED Vss P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vin Vss + Figura 2-11 Circuito de LED controlado pelo BASIC Stamp A entrada do circuito de LED está agora ligada a um pino BASIC Stamp I/O em vez de Vdd ou Vss. Resistores são essenciais. Lembre-se sempre de usar um resistor. Sem ele, muita corrente fluirá através do circuito o que pode danificar diversas peças em seu circuito BASIC Stamp, Board of Education ou HomeWork Board. Página - 33 Acendendo e Apagando o LED com um Programa O programa de exemplo, faz com que o diodo emissor de luz pisque, acendendo e apagando, uma vez por segundo. Ele introduz várias novas técnicas de programação ao mesmo tempo. Após executá-lo, você vai ler explicações de diferentes partes do programa para entender melhor como ele funciona. Exemplo de Programa: LedOnOff.bs2 Coloque o código LedOnOff.bs2 no Basic Stamp Editor. Reconecte a energia do Board of Education ou do HomeWork Board. Execute o programa. Verifique se o LED pisca on e off uma vez por segundo. Desconecte a energia quando o programa estiver concluído. ' O que é um Microcontrolador - LedOnOff.bs2 ' Acenda e apague o LED. Repete uma vez por segundo indefinidamente. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "O LED conectado a P14 está piscando!" DO HIGH 14 PAUSE 500 LOW 14 PAUSE 500 LOOP Como Funciona o LedOnOff.bs2 O comando DEBUG “O LED conectado a P14 está piscando!” faz esta declaração aparecer no DEBUG Terminal. O comando HIGH 14 fará o BASIC Stamp conectar internamente o pino I/O P14 para Vdd. Isso fará o LED ficar aceso (on). O comando PAUSE 500 fará o BASIC Stamp não fazer nada por meio segundo até o LED acender. O número 500 chamará o comando PAUSE para esperar 500/1000 por segundo. O número que acompanhará o PAUSE é chamado de argumento. Argumentos dão ao PBASIC a informação que ele precisa para trabalhar. Se você procurar PAUSE no manual BASIC Stamp, você irá descobrir que esse número é chamado de argumento Duration. O nome Duration foi escolhido para esse argumento para mostrar que o comando PAUSE significa pausa por uma certa duração (“duration”) de tempo em milésimos de segundos. O que é milésimo de segundos? É um segundo dividido por mil e é abreviado “ms”. São necessários 1000 ms para igualar a um segundo. O comando LOW 14 fará o BASIC Stamp conectar internamente o pino I/O P14 para Vss. Isso fará com que o LED fique off. Desde que o LOW 14 esteja acompanhado por um outro PAUSE 500, o LED ficará off por meio segundo. Página - 34 O motivo da constante repetição do código é porque está encaixado entre as palavras chaves do PBASIC DO e LOOP. Figura 0-12 mostra como DO…LOOP funciona. Ao colocar o segmento do código que gira o LED on e off com pausas entre DO e LOOP, chamará o BASIC Stamp a executar esses quatro comandos constantemente. O resultado será que o LED piscará on e off, repetidamente até que você desligue a alimentação, pressione e segure o botão Reset, ou até que a bateria descarregue. Códigos que repetem um conjunto de comandos, indefinidamente, são chamados “loop infinito”. DO HIGH 14 PAUSE 250 LOW 14 PAUSE 250 Figura 2-12 DO…LOOP O código entre as palavras-chave DO e LOOP é executado repetidas vezes indefinidamente. LOOP Um Teste de Diagnóstico para o Seu Computador Embora não seja comum, existem alguns sistemas de computadores, tais como certos “laptops” e “docking stations”, que vão interromper o programa PBASIC depois da primeira vez através de um DO...LOOP. Esses computadores têm um design de porta serial não-padrão. Ao colocar um comando DEBUG no programa LedOnOff.bs2, o DEBUG Terminal aberto evita que isso possivelmente aconteça. Na próxima atividade reexecute esse programa sem o comando DEBUG para verificar se o seu computador tem este problema de porta serial não-padrão. Não é comum, mas seria importante você saber. Abra o programa LedOnOff.bs2. Delete todo o comando DEBUG. Execute e modifique o programa enquanto você observa o LED. Se o LED piscar on e off continuamente, tal como aconteceu quando você executou o programa original com o comando DEBUG, o computador não tem esse problema. Se o LED piscar on e off apenas uma vez, e parar, significa que você tem um computador com um design de porta serial não-padrão. Se você desconectar o cabo serial da sua placa e pressionar o botão Reset, o BASIC Stamp vai executar o programa corretamente, sem congelamento. Nos programas que você escrever, você sempre terá que adicionar um único comando DEBUG: DEBUG “Programa em andamento!” … logo após as diretivas do compilador. Ele vai abrir o DEBUG Terminal e manter a porta COM aberta. Isso impedirá que os programas congelem após uma passagem pelo DO...LOOP, ou quaisquer outros comandos de looping que você aprenderá nos capítulos posteriores. Você vai ver esse comando em alguns dos exemplos de programas que não precisam de uma instrução de DEBUG. Assim, você será capaz de executar todos os programas restantes deste livro, mesmo se o computador falhar no teste de Página - 35 diagnóstico, mas, nesse caso, não se esqueça de adicionar um comando curto de DEBUG quando você começar a escrever seus próprios programas. Sua vez – Cronometragem e Repetições Mudando argumento Duration do comando PAUSE você pode alterar a quantidade de tempo que o LED permanece ligado e desligado. Por exemplo, alterando os argumentos Duration para 250, ele fará com que o LED pisque e desligue duas vezes por segundo. O DO...LOOP em seu programa agora vai ficar assim: DO HIGH 14 PAUSE 250 LOW 14 PAUSE 250 LOOP Abrir LedOnOff.bs2 e salvar uma cópia como LedOnOffYourTurn.bs2. Mudar ambos: comando PAUSE e argumento Duration de 500 para 250, e reexecutar o programa. Se você quer fazer o LED piscar on e off uma vez a cada três segundos, com o tempo “low” duas vezes maior do que o “high”, você pode programar o comando PAUSE, usando o PAUSE 1000 após o comando HIGH, para que ele leve apenas um segundo. O comando PAUSE após o comando LOW 14 terá que ser PAUSE 2000. DO HIGH 14 PAUSE 1000 LOW 14 PAUSE 2000 LOOP Modifique e reexecute o programa usando o trecho de código acima. Uma experiência divertida é ver o quanto você pode deixar as pausas mais curtas e ainda ter o LED piscando. Quando o LED estiver piscando muito rápido, mas parecer que ele está simplesmente aceso, é chamado de persistência de visão. Como testar e ver qual é a sua persistência de visão. Tente modificar os argumentos Duration de seu comando de PAUSE para que eles sejam 100. Reexecute seu programa e cheque a oscilação. Reduza ambos os argumentos Duration por 5 e tente novamente. Mantenha sempre reduzindo os argumentos Duration até que o LED pareça estar ligado o tempo todo, sem oscilação. Ficará mais escuro do que o normal, mas não deve parecer que pisca. Página - 36 Uma última coisa a fazer é criar um pisca-pisca de LED de uma única piscada. Quando o programa é executado, o LED pisca apenas uma vez. Esta é uma maneira de olhar para a funcionalidade do DO...LOOP. Você pode remover temporariamente o DO... LOOP do programa, colocando um apóstrofo a esquerda, de ambas as palavras chaves do DO e do LOOP como mostrado abaixo. ' DO HIGH 14 PAUSE 1000 LOW 14 PAUSE 2000 ' LOOP Modifique e reexecute o programa usando o trecho de código acima. Explique por que o LED piscou uma só vez? Comentando uma linha de código: Colocar um apóstrofo à esquerda de um comando é transformá-lo em um comentário. Esta é uma ferramenta útil, porque na verdade você não tem que apagar o comando para ver o que acontecerá se você removê-lo do programa. É muito mais fácil adicionar e remover um apóstrofo do que apagar e digitar novamente os comandos. ATIVIDADE #3: CONTANDO E REPETINDO Na atividade anterior, ou o circuito de LED piscava on e off o tempo todo, ou piscava uma única vez e parava. E se você quiser que o LED pisque e desligue dez vezes? Computadores (incluindo o BASIC Stamp) são ótimos para manter a totalidade de funcionamento de quantas vezes algo acontece. Os computadores também podem ser programados para tomar decisões com base numa variedade de condições. Nesta atividade, você vai programar o BASIC Stamp para que o LED pare de piscar on e off após 10 vezes. Contando peças e circuito de teste Use o exemplo de circuito mostrado na Figura 2-11 na página 32. Quantas Vezes? Há muitas maneiras de fazer um LED piscar on e off dez vezes. O caminho mais simples é usar o loop FOR...NEXT. O loop FOR...NEXT é semelhante ao DO...LOOP. Embora o loop possa ser utilizado para repetir comandos um determinado número de vezes, FOR...NEXT é mais fácil de usar. Isto, algumas vezes é chamado de loop contado ou finito. O loop FOR...NEXT depende de uma variável para controlar quantas vezes o LED piscou on e off. Uma variável é uma palavra de sua escolha, que é usada para armazenar um valor. O próximo exemplo de programa escolhe o contador de palavras para "contar" quantas vezes o LED está on e off. Página - 37 A escolha de palavras para nomes de variáveis tem várias regras: 1. O nome não pode ser uma palavra, que já é utilizada por PBASIC. Essas palavras são chamadas de palavras reservadas, e alguns exemplos que você já deve estar familiarizado são DEBUG, PAUSE, HIGH, LOW, DO, e LOOP. Você pode ver a lista completa de palavras reservadas no Manual do BASIC Stamp. 2. O nome não pode ter espaço. 3. Portanto o nome deve conter letras, números ou sublinhados e deve começar com uma letra. 4. O nome deve ser inferior a 33 caracteres. Exemplo de Programa: LedOnOffTenTimes.bs2 O programa LedOnOffTenTimes.bs2 demonstrou como usar o loop FOR...NEXT para piscar o LED on e off dez vezes. O circuito de teste da Atividade #2 deve ser construído (ou reconstruído). Entre com o código LedOnOffTenTimes.bs2 no BASIC Stamp Editor. Conecte a energia do Board of Education ou do HomeWork Board. Execute o programa. Verifique se o LED pisca on e off dez vezes. Execute o programa uma segunda vez, e verifique se o valor do contador mostrado no DEBUG Terminal monitora com precisão quantas vezes o LED piscou. Dica: em vez de clicar em Executar uma segunda vez, você pode pressionar e soltar o botão Reset no seu Board of Education ou HomeWork Board. ' O que é um Microcontrolador - LedOnOffTenTimes.bs2 ' Acenda e apague o LED. Repita 10 vezes. ' {$STAMP BS2} ' {$PBASIC 2.5} counter VAR Byte FOR counter = 1 TO 10 DEBUG ? counter HIGH 14 PAUSE 500 LOW 14 PAUSE 500 NEXT DEBUG "Pronto!" END Como Funciona o LedOnOffTenTimes.bs2 Esta declaração PBASIC: Página - 38 counter VAR Byte …diz ao BASIC Stamp Editor que seu programa irá usar o contador de palavras como uma variável que pode armazenar o valor de informações de um byte. O que é Byte? Um byte é memória suficiente para armazenar um número entre 0 e 255. O BASIC Stamp tem quatro tipos diferentes de variáveis, e cada uma pode armazenar uma gama diferente de números: Tabela 2-2: Tipos de variáveis e valores que elas podem armazenar Tipo de variável Intervalo de valores Bit Nib Byte 0à1 0 à 15 0 à 255 Word 0 à 65535 A instrução DEBUG pode incluir formatadores que determinam como as informações devem ser exibidas no DEBUG Terminal. Colocar o “?” ponto de interrogação formatador antes de uma variável em um comando DEBUG diz ao DEBUG Terminal para exibir o nome da variável e seu valor. Isto é como o comando: DEBUG ? counter … mostra o nome e o valor da variável de contador no DEBUG Terminal. O loop FOR...NEXT e todos os comandos no seu interior são mostrados abaixo. A declaração FOR ... counter = 1 to 10 diz ao BASIC Stamp que ele terá que definir a variável de contador para 1, em seguida, manter a execução dos comandos até que ele receba a declaração NEXT. Quando o BASIC Stamp chega à instrução NEXT, ele salta de volta para a instrução FOR. A instrução FOR adiciona um para o valor do contador. Em seguida, ela verifica se contador é maior do que dez ainda. Se não, o processo se repete. Quando o valor do contador finalmente atinge onze, o programa ignora os comandos entre as declarações FOR e NEXT e avança para o comando que vem depois da declaração NEXT. FOR counter = 1 to 10 DEBUG ? counter HIGH 14 PAUSE 500 LOW 14 PAUSE 500 NEXT O comando que vem depois da declaração NEXT é: DEBUG "Pronto!" Página - 39 Este comando está incluso apenas para mostrar o que o programa faz, depois de dez vezes através do loop FOR ... NEXT. Ele avança para o comando que vem depois da instrução NEXT. Sua Vez – Outras Maneiras de Contar No programa LedOnOffTenTimes.bs2, substitua a declaração: FOR counter = 1 to 10 para: FOR counter = 1 to 20 Reexecute o programa. O que o programa fez de diferente, e o que era esperado? Tente uma segunda modificação para a declaração FOR. Desta vez, mude para: FOR counter = 20 to 120 STEP 10 Quantas vezes o LED pisca? Quais são os valores exibidos no DEBUG Terminal? ATIVIDADE #4: CONSTRUINDO E TESTANDO O SEGUNDO CIRCUITO DE LED Os LEDs indicadores podem ser usados para informar muitas coisas para o usuário da máquina. Muitos dispositivos precisam de dois, três, ou mais LEDs para informar ao usuário se a máquina está pronta ou não, se houve uma avaria, se uma tarefa já foi executada, e assim por diante. Nesta atividade, você vai repetir o teste no circuito de LED da Atividade #1 para um segundo circuito de LED. Então você vai ajustar o programa de exemplo da Atividade #2 para garantir que o circuito de LED está conectado corretamente ao BASIC Stamp. Depois disso, você irá modificar o exemplo de programa da Atividade #2 para fazer os LEDs operarem em conjunto. Peças Extras Necessárias Além das peças que você utilizou nas Atividades 1 e 2, você necessitará das seguintes peças: (1) LED – amarelo (1) Resistor – 470 Ω (amarelo-violeta-marrom) Construindo e Testando o Segundo Circuito de LED Na Atividade #1, você testou manualmente o primeiro circuito de LED para ter certeza de que ele funcionava antes de conectá-lo ao BASIC Stamp. Antes de ligar o segundo circuito de LED ao BASIC Stamp, é importante testá-lo também. Desconecte a energia do Board of Education ou do HomeWork Board. Construa o segundo circuito de LED mostrado na Figura 2-13. Reconecte a energia do Board of Education ou do HomeWork Board. Será que o circuito de LED que você acabou de adicionar liga? Se sim, então continue. Se não, na Atividade #1 tem algumas sugestões de resolução de problemas que você pode repetir neste circuito. Página - 40 Vdd Vdd 470 Ω P14 470 Ω LED LED Vss Vss Vss Vin + X3 + P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Figura 2-13 Manual do circuito de teste para o segundo LED Desconecte a energia do seu Board of Education ou do HomeWork Board. Modifique o segundo circuito de LED que acabou de testar, ligando o fio do resistor do circuito de LED (entrada) (input) para P15, como mostrado na Figura 2 -14. Vdd X3 P15 470 Ω P14 470 Ω LED Vss LED Vss P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vin Vss + + Figura 2-14 Conectar o segundo LED no BASIC Stamp Esquemático (esquerda) e diagrama de fiação (direita). Usando um Programa para Testar o Segundo Circuito de LED Na Atividade #2, você utilizou um programa de exemplo e os comandos de HIGH e LOW para controlar que o circuito de LED estivesse conectado a P14. Estes comandos têm que ser alterados para controlar que o circuito de LED esteja conectado a P15. Em vez de usar HIGH 14 e LOW 14, você irá usar HIGH 15 e LOW 15. Exemplo de Programa: TestSecondLed.bs2 Entre com TestSecondLed.bs2 no BASIC Stamp Editor. Conecte a energia do Board of Education ou do HomeWork Board. Execute o TestSecondLED.bs2. Verifique se o circuito de LED conectado a P15 está piscando. Se o LED que estiver ligado ao P15 piscar, passe para o próximo exemplo (Controlar ambos os LEDs). Se o circuito de LED conectado a P15 não estiver piscando, verifique o circuito para checar erros de fiação e seu programa para checar erros de digitação e tente novamente. Página - 41 ' O que é um Microcontrolador - TestSecondLed.bs2 ' Acenda e apague o LED ligado a P15. ' Repita uma vez por segundo indefinidamente. ' {$STAMP BS2} ' {$PBASIC 2.5} DEBUG "Programa em andamento!" DO HIGH 15 PAUSE 500 LOW 15 PAUSE 500 LOOP Controlando Ambos os LEDs Sim, você pode fazer os LEDs piscarem de uma só vez. Uma forma de fazer isso é usar dois comandos HIGH antes do primeiro comando PAUSE. Um comando HIGH define P14 HIGH, e o próximo comando HIGH define P15 HIGH. Você também vai precisar de dois comandos LOW para apagar os dois LEDs. É verdade que ambos os LEDs não vão ligar e desligar exatamente ao mesmo tempo, porque um está on e off após o outro. No entanto, não há mais do que um milésimo de segundo de diferença entre as duas alterações, logo, o olho humano não consegue detectar. Exemplo de Programa: FlashBothLeds.bs2 Coloque o código FlashBothLeds.bs2 no BASIC Stamp Editor. Execute o programa. Cheque que ambos os LEDs pisquem on e off ao mesmo tempo. ' O que é um Microcontrolador - FlashBothLeds.bs2 ' Acenda e apague os LEDs conectados a P14 e P15. ' {$STAMP BS2} ' {$PBASIC 2.5} DEBUG "Programa em andamento!" DO HIGH 14 HIGH 15 PAUSE 500 LOW 14 LOW 15 PAUSE 500 LOOP Página - 42 Sua Vez – LEDs Alternados Você pode fazer com que os LEDs se alternem trocando os comandos HIGH e LOW que controlam um dos pinos de I/O. Isto significa que enquanto um LED estiver ligado, o outro estará desligado. Modique FlashBothLeds.bs2 para que as palavras chaves entre os comandos DO e LOOP fiquem assim: HIGH 14 LOW 15 PAUSE 500 LOW 14 HIGH 15 PAUSE 500 Execute e modifique a versão do FlashBothLeds.bs2 e verifique se os LEDs piscam alternadamente on e off. ATIVIDADE #5: USANDO A DIREÇÃO DA CORRENTE PARA CONTROLAR O LED BICOLOR O dispositivo mostrado na Figura 2-15 é um monitor de segurança para as chaves eletrônicas. Quando uma chave eletrônica com o código correto é usada, o diodo emissor de luz muda de cor, e uma porta se abre. Este tipo de diodo emissor de luz é chamado LED bicolor. Esta atividade responde a duas perguntas: 1. Como o LED muda de cor? 2. Como utilizar um com o BASIC Stamp? Figura 2-15 LED bicolor em um dispositivo de segurança Quando a porta está trancada, este LED bicolor brilha em vermelho. Quando a porta é desbloqueada por uma chave eletrônica com o código correto, o LED fica verde. Apresentando o LED Bicolor Símbolo esquemático do LED bicolor e desenho da peça são mostrados na Figura 2-16. Página - 43 Figura 2-16 LED Bicolor Símbolo esquemático (à esquerda) e parte de desenho (à direita). O LED bicolor é realmente apenas dois LEDs em um único pacote. Figura 2-17 mostra como você pode aplicar tensão em uma direção e o LED acender em verde. Ao desligar o LED e colocá-lo de volta na posição invertida, o LED terá então um brilho vermelho. Tal como acontece com os outros LEDs, se você conectar dois terminais de circuito de Vss, o LED não emitirá luz. Figura 2-17 LED bicolor e tensão aplicada Verde (à esquerda), vermelho (centro) e nenhuma luz (à direita) Partes do Circuito do LED Bicolor (1) LED – bicolor (1) Resistor – 470 Ω (amarelo-violeta-marrom) (1) Fios de ligação Construindo e Testando o Circuito do LED Bicolor Figura 2-18 mostra o teste manual do LED bicolor. Desconecte a energia do Board of Education ou do HomeWork Board. Construa o circuito mostrado no lado esquerdo na Figura 0-18. Reconecte a energia e verifique se o LED bicolor está emitindo uma luz verde. Desconecte a energia novamente. Modifique seu circuito para que ele corresponda ao mostrado no lado direito da Figura 2-18. Reconecte a energia. Verifique se o LED bicolor está agora emitindo uma luz vermelha. Desconecte a energia. Página - 44 O que acontece se as cores de meu LED bicolor estiverem invertidas? LEDs bicolores são fabricados como ilustrado na Figura 2-16, com as cores invertidas. Se o seu LED bicolor brilha em vermelho quando ele está conectado ao circuito que deveria fazê-lo brilhar verde e vice-versa, as cores do seu LED estão invertidas. Se for esse o caso, sempre plugue o pino 1 onde nos diagramas mostrar o pino 2 e pino 2 onde nos diagramas mostrar o pino 1. Vdd 1 Vin 2 Vss X3 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Figura 2-18 Teste manual do LED bicolor Vdd X3 2 Vin 1 Vss LED bicolor: verde (à esquerda) e vermelho (à direita). P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Controlar um LED bicolor com o BASIC Stamp requer dois pinos de I/O. Depois de ter verificado manualmente que o LED bicolor trabalha utilizando o teste manual, você pode conectar o circuito para o BASIC Stamp, como mostrado na Figura 2-19. Conecte o circuito do LED bicolor ao BASIC Stamp como mostrado na Figura 2-19. Página - 45 Figura 2-19 LED bicolor conectado ao BASIC Stamp Esquemática (à esquerda) e diagrama de fiação (à direita). BASIC Stamp - Controle do LED Bicolor Figura 2-20 mostra como você pode usar P15 e P14 para controlar o fluxo de corrente no circuito de LED bicolor. O esquema acima mostra como a corrente flui através do LED verde quando P15 está definido para Vdd com HIGH e P14 está definido para Vss com LOW. Isso ocorre porque o LED verde irá deixar a corrente passar através dele quando a pressão elétrica for aplicada como mostrado, mas o LED vermelho atuará como uma válvula fechada e não deixará a corrente passar através dele. O LED bicolor brilha verde. O esquema abaixo mostra o que acontece quando P15 está definido para Vss e P14 está definido para Vdd. A pressão elétrica está invertida. O LED verde desliga e não permite que a corrente passe. Enquanto isso, o LED vermelho acende, e a corrente passa através do circuito na direção oposta. HIGH = Vdd P15 1 Current Figura 2-20 BASIC Stamp teste do LED bicolor 2 LOW = Vss P14 470 Ω LOW = Vss P15 Corrente através do diodo emissor de luz verde (acima) e um LED vermelho (em baixo). 1 Current 2 HIGH = Vdd P14 470 Ω A Figura 2-20 mostra também a chave para a programação do BASIC Stamp para fazer o LED bicolor brilhar em duas cores diferentes. O esquema acima mostra como fazer o LED bicolor brilhar verde com HIGH 15 e LOW 14. O esquema abaixo mostra como fazer o LED bicolor brilhar vermelho usando LOW 15 e HIGH 14. Para desligar o Página - 46 LED, envie sinais de baixa tanto para P14 e P15 usando LOW 15 e LOW 14. Em outras palavras, use LOW em ambos os pinos. O LED bicolor também se desligará se você enviar sinais de HIGH para ambos os P14 e P15. Por quê? Porque a pressão elétrica (voltagem) é a mesma em P14 e P15, independentemente de você definir os pinos I/O HIGH ou LOW. Exemplo de Programa: TestBiColorLED.bs2 Reconecte a energia. Insira e execute o código TestBiColorLed.bs2 no BASIC Stamp Editor. Verifique os ciclos de LED entre o vermelho, verde, na posição off. ' O que é um Microcontrolador - TestBiColorLed.bs2 ' Faça o LED bicolor brilhar vermelho, depois verde e apagar. ' {$STAMP BS2} ' {$PBASIC 2.5} PAUSE 1000 DEBUG "Programa em andamento!", CR DO DEBUG "Verde..." HIGH 15 LOW 14 PAUSE 1500 DEBUG "Vermelho..." LOW 15 HIGH 14 PAUSE 1500 DEBUG "Apagado...", CR LOW 15 LOW 14 PAUSE 1500 LOOP Sua vez – Luzes do Visor Na Atividade #3, a variável chamada counter foi usada para controlar quantas vezes o LED piscou. O que acontecerá se você usar o valor do counter para controlar o comando PAUSE argumento Duration ao alterar repetidamente a cor do LED bicolor? Renomear e salvar TestBiColorLed.bs2 para TestBiColorLedYourTurn.bs2. Adicionar a variável counter antes da declaração: counter VAR BYTE Substituir o código de teste no DO...LOOP por este loop FOR...NEXT. FOR counter = 1 to 50 HIGH 15 Página - 47 LOW 14 PAUSE counter LOW 15 HIGH 14 PAUSE counter NEXT Quando estiver concluído, seu código deve parecer com: counter VAR BYTE DO FOR counter = 1 to 50 HIGH 15 LOW 14 PAUSE counter LOW 15 HIGH 14 PAUSE counter NEXT LOOP No início de cada passagem através do loop FOR...NEXT o valor PAUSE (argumento Duration) é apenas um milésimo de segundo. Cada vez que através loop FOR...NEXT, a pausa recebe mais por um milésimo de segundo de cada vez até chegar a 50 milésimos de segundo. O DO...LOOP faz com que o loop FOR...NEXT seja executado repetidamente. Execute o programa modificado e observe o efeito. Página - 48 SUMÁRIO O BASIC Stamp pode ser programado para mudar um circuito com um diodo emissor de luz (LED) para on e off. Os LEDs indicadores são úteis em uma variedade de lugares, incluindo muitos monitores de computador, discos rígidos e outros dispositivos. O diodo emissor de luz foi introduzido, juntamente com uma técnica para identificar seus terminais de ânodo e cátodo. Um circuito de LED tem que ter uma resistência para limitar a corrente que passa através dele. Resistores foram introduzidos juntamente com um dos esquemas de codificação mais comuns para indicar o valor de um resistor. O BASIC Stamp muda um circuito de LED on e off, ligando internamente um pino de I/O também para VDD ou VSS. O comando HIGH pode ser usado para fazer o BASIC Stamp conectar internamente um de seus pinos de I/O para Vdd e o comando LOW pode ser usado para conectar internamente um pino de I/O para VSS. O comando PAUSE é usado para fazer com que o BASIC Stamp não execute os comandos por um período de tempo. Este foi usado para fazer os LEDs permanecerem on e/ou off por um certo período de tempo. A quantidade de tempo é determinada pelo número utilizado no argumento Duration do comando PAUSE. DO...LOOP pode ser usado para criar um loop infinito. Os comandos entre as palavras chaves DO e LOOP serão executados repetidamente. Mesmo que isso seja chamado de um loop infinito, o programa pode ser reiniciado desconectando e reconectando a energia ou pressionando e soltando o botão Reset. Um novo programa também pode ser baixado para o BASIC Stamp, e isso vai apagar o programa com o loop infinito. Loops contados podem ser feitos com FOR...NEXT, uma variável para manter o controle de quantas repetições de loop tem sido feitas, e os números para especificar onde iniciar e parar a contagem. Direção de corrente e tensão de polaridade foram introduzidas utilizando um LED bicolor. Se a tensão é aplicada em todo o circuito de LED, a corrente passará por ele em uma direção, e ele brilhará com uma cor específica. Se a tensão de polaridade é invertida, cursos de corrente passam através do circuito no sentido oposto e irá brilhar numa cor diferente. Questões 1. Qual é o nome desta letra grega: Ω, e a que medição essa letra Ω se refere? 2. Quais resistências permitiriam mais corrente através do circuito, de um resistor de 470 Ω ou um resistor de1000 Ω? 3. Como você conecta dois fios usando uma placa de montagem? Você pode usar uma placa de montagem para conectar quatro fios juntos? 4. O que você sempre tem que fazer antes de modificar um circuito que você construiu sobre uma placa? 5. Quanto tempo deve passar o PAUSE 10000? 6. Como você poderia provocar o BASIC Stamp a não fazer nada por um minuto inteiro? 7. Quais são os diferentes tipos de variáveis? 8. Pode um byte manter o valor de 500? 9. O que fará o comando HIGH 7? Página - 49 Exercícios 1. Desenhe o esquema de um circuito de LED como o que você trabalhou na Atividade #2, mas ligue o circuito em P13 em vez de P14. Explique como você poderia modificar LedOnOff.bs2 na página 3, para que ele faça o circuito de LED piscar on e off quatro vezes por segundo. 2. Explique como modificar LedOnOffTenTimes.bs2 para que ele faça o circuito de LED piscar on e off 5.000 vezes antes de parar. Dica: você vai precisar modificar apenas duas linhas de código. Projeto 1. Faça uma contagem de 10 segundos usando um LED amarelo e um LED bicolor. Faça o LED bicolor começar vermelho por 3 segundos. Após 3 segundos, altere o LED bicolor para verde. Quando o LED bicolor mudar para verde, pisque o LED amarelo on e off uma vez por segundo durante dez segundos. Quando o LED amarelo piscar, o LED bicolor deve voltar para o vermelho e ficar desse jeito. Soluções Q1. Ômega refere-se à ohm que mede quão fortemente algo resiste ao fluxo de corrente. Q2. O resistor 470 Ω: valores mais elevados resistem mais fortemente do que os valores mais baixos, portanto, valores mais baixos permitem maior fluxo de corrente. Q3. Para conectar dois fios, ligue os 2 fios no mesmo grupo de 5 soquetes. Você pode conectar 4 fios, ligando todos os 4 fios no mesmo grupo de 5 soquetes. Q4. Desligue a alimentação. Q5. 10 segundos. Q6. PAUSE 60000 Q7. Bit, Nib, Byte, e Word Q8. Não. O maior valor que um byte pode conter é 255. O valor 500 está fora de alcance para um byte. Q9. HIGH 7 fará com que o BASIC Stamp conecte internamente o pino I/O P7 para Vdd. E1. A duração da pausa tem de ser reduzida para 500 ms / 4 = 125 ms. Para usar i pino I/O P13, HIGH 14 e LOW 14 foram substituídos por HIGH 13 e LOW 13. E2. P13 470 Ω LED Vss DO HIGH 13 PAUSE 125 LOW 13 PAUSE 125 LOOP A variável counter tem que ser mudada para Word size, e a declaração FOR tem que ser modificada para contar de 1 a 5000. counter VAR Word FOR counter = 1 to 5000 Página - 50 DEBUG ? counter, CR HIGH 14 PAUSE 500 LOW 14 PAUSE 500 NEXT P1. O esquema do LED bicolor do lado esquerdo, está inalterado a partir da Figura 2-19, na página 46. O esquema do LED amarelo baseia-se na Figura 2-11, na página 33. Para este projeto, P14 foi alterado para P13, e um LED amarelo foi usado em vez de verde. NOTA: Quando o BASIC Stamp fica sem comandos, ele entra em um modo de baixa potência que faz com que os LEDs bicolores pisquem rapidamente a cada 2,3 segundos. O mesmo aplica-se após o programa executar um comando END. Há outro comando chamado STOP que você pode adicionar ao final do programa para deter quaisquer sinais de HIGH / LOW, sem entrar em modo de baixa energia, que por sua vez o impede de piscar. P2. P13 470 Ω Yellow LED Vss ' O que é um Microcontrolador - Ch02Prj01_Countdown.bs2 ' Contagem de dez segundos com LEDs vermelho, verde e amarelo. ' Vermelho/Verde: LED bicolor no P15, P14. Amarelo: P13 ' {$STAMP BS2} ' {$PBASIC 2.5} DEBUG "Programa em andamento!" counter VAR Byte ' Vermelho por três segundos... LOW 15 HIGH 14 PAUSE 3000 ' Verde por dez segundos... HIGH 15 LOW 14 ' ...enquanto o LED amarelo pisca FOR counter = 1 TO 10 HIGH 13 PAUSE 500 LOW 13 PAUSE 500 NEXT ' Vermelho aceso LOW 15 ' LED bicolor vermelho ' LED bicolor verde ' LED amarelo aceso ' LED amarelo apagado ' LED bicolor vermelho Página - 51 HIGH 14 Página - 52 Capítulo 3: Entrada Digital – Botões ENCONTRADOS EM CALCULADORAS, JOGOS PORTÁTEIS E APLICATIVOS Quantos dispositivos com botões você usa diariamente? Aqui estão alguns exemplos que podem estar na sua lista: computador, mouse, calculadora, forno de microondas, controle remoto de TV, jogos manuais e telefone celular. Em cada dispositivo, há um microcontrolador digitalizando os botões de pressão e de espera para mudar o circuito. Quando o circuito muda, o microcontrolador detecta a alteração e toma medidas. Até o final deste capítulo, você terá experiências com criação de circuitos de botões e programará o BASIC Stamp para monitorá-los e tomar medidas quando ocorrerem essas alterações. RECEBIMENTO VS. ENVIO DE SINAIS DE HIGH E LOW No Capítulo 2, você programou o BASIC Stamp para enviar sinais de high e low, e usou circuitos de LED para exibir esses sinais. O envio de sinais de high e low significa que você usou um pino de I/O BASIC Stamp como uma saída. Neste capítulo, você vai usar um pino de I/O do BASIC Stamp como entrada. Em uma entrada, um pino de I/O ouve sinais de high/low, em vez de enviá-los. Você vai enviar esses sinais para o BASIC Stamp usando um circuito de botão, e você vai programar o BASIC Stamp para reconhecer se o botão foi pressionado ou não. Outros termos que significam envio e recebimento de HIGH/LOW. O envio de sinais de high/low é descrito de maneiras diferentes. Você pode ver o envio mencionado, como transmissão, controle ou comutação. Em vez de HIGH/LOW, você pode vê-lo chamado de binário, TTL, CMOS, ou sinais booleanos. Outro termo para recepção é detecção. ATIVIDADE #1: TESTANDO UM BOTÃO COM UM CIRCUITO DE LED Se você pode usar um botão para enviar um sinal de alta ou de baixa (high ou low) para o BASIC Stamp, você pode também controlar um LED com um botão? A resposta é sim, e você vai usá-lo para testar um botão nesta atividade. Apresentando o Botão A Figura 3-1 mostra um diagrama esquemático do símbolo e desenho da peça de um botão de pressão normalmente aberto. Dois dos pinos do botão de pressão estão conectados a cada um dos terminais. Isto significa que ligar um fio ou uma peça ao pino 1 do botão é o mesmo que ligar ao pino 4. A mesma regra aplica-se com os pinos 2 e 3. A razão pela qual o botão não tem apenas dois pinos é porque ele precisa de estabilidade. Se o botão tivesse apenas dois pinos, eles poderiam eventualmente dobrar e quebrar devido a pressão que o botão recebe quando pressionado. 1, 4 2, 3 Figura 3-1 Botão normalmente aberto 1 4 2 3 Símbolo esquemático (à esquerda) e parte de desenho (à direita) Página - 53 O lado esquerdo da Figura 3-2 mostra a aparência de um botão de pressão normalmente aberto quando não está pressionado. Quando o botão não está pressionado, existe uma defasagem entre os terminais 1,4 e 2,3. Esta diferença faz com que o terminal 1,4 não possa levar corrente para o terminal 2,3. Isto é chamado de circuito aberto. O nome "normalmente aberto" significa que o estado normal do botão (não pressionado) forma um circuito aberto. Quando o botão é pressionado, a distância entre os terminais 1,4 e 2,3 é reduzida por um metal condutor. Isto é chamado de circuito fechado, e assim a corrente pode fluir através do botão de pressão. 1, 4 1, 4 2, 3 2, 3 Figura 3-2 Botão normalmente aberto Não pressionado (à esquerda) e pressionado (à direita) Peças de Teste para o Botão de Pressão (1) LED – escolha uma cor (1) Resistor – 470 Ω (amarelo-violeta-marrom) (1) Botão – normalmente aberto (1) Fios Construindo um Circuito de Teste do Botão A Figura 3-3 mostra o circuito que você pode construir para testar manualmente o botão. Sempre desconecte a energia do Board of Education ou do BASIC Stamp HomeWork Board antes de fazer qualquer mudança ou teste de circuito. Daqui em diante, as instruções não vão dizer: "Desligue a alimentação" entre cada modificação do circuito. Cabe a você se lembrar de fazer isso. Sempre reconecte a energia do Board of Education ou do BASIC Stamp HomeWork Board antes de baixar o programa do BASIC Stamp. Construa o circuito mostrado na Figura 3-3. Vdd Vdd Vin Vss + X3 1, 4 2, 3 470 Ω LED Vss P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Figura 3-3 Circuito de teste do botão Página - 54 Testando um Botão com um Circuito de LED Quando o botão não for pressionado, o LED estará desligado. Se a fiação estiver correta, quando o botão for pressionado, o LED deverá ser ligado (emitindo luz). Sinais de alerta: Se o Power LED do Board of Education piscar, escurecer ou desligar completamente quando você reconectar a energia, pode significar que há um curto-circuito de Vdd para Vss ou de Vin para VSS. Se isso acontecer, desligue imediatamente, encontre e corrija o erro em seu circuito. O Power LED construído dentro do HomeWork Board é diferente. Tanto pode ser rotulado de "Power" ou "Running" e só brilha enquanto um programa está em execução. Se um programa termina, porque ele executa um comando END ou porque é executado sem comandos, o LED desliga. Verifique se o LED em seu circuito de teste está desligado. Pressione e segure o botão e verifique se o LED emite luz enquanto você estiver pressionando o botão. Como o Circuito de Botão Funciona O lado esquerdo da Figura 3-4 mostra o que acontece quando o botão não está pressionado. O circuito de LED não está ligado a Vdd. É um circuito aberto que não pode conduzir corrente. Ao pressionar o botão de pressão, como mostrado no lado direito da figura, você fecha a ligação entre os terminais com um condutor de metal. Isto faz um caminho para que os elétrons fluam através do circuito e como resultado o diodo emissor de luz emite luz. Vdd Vdd 1, 4 1, 4 2, 3 2, 3 No Current 470 Ω Figura 3-4 Botão não pressionado e pressionado. 470 Ω Current LED LED Vss Botão não pressionado: circuito aberto e luz desligada (à esquerda) Botão pressionado: circuito fechado e luz ligada (à direita) Vss Sua Vez – Um Curto-Circuito A Figura 3-5 mostra um circuito que vai fazer com que o diodo emissor de luz se comporte de forma diferente. Quando o botão for pressionado, o LED apaga. Uma vez que este botão liga um condutor entre os terminais 1,4 e 2,3, quando pressionado, significa que a eletricidade passa a circular pelo menor caminho da resistência através do botão em vez de ir através do LED. Ao contrário dos curtos-circuitos possíveis discutidos na caixa de Sinais de Alerta, o curto-circuito que o botão pressionado provoca através dos terminais do LED não danifica qualquer circuito e serve a um propósito útil. Construa o circuito mostrado na Figura 3-5. Página - 55 Repita os testes realizados no primeiro circuito de botão que você construiu com este novo circuito. Vdd Vdd Vin Vss X3 1, 4 LED 2, 3 470 Ω Vss P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 + Figura 3-5 Diodo emissor de luz que entra em curtocircuito com uso do botão O que você pode realmente fazer com o LED? Até agora, o cátodo do LED sempre foi ligado ao Vss. Agora, o LED está num local diferente no circuito, com o seu ânodo ligado ao Vss. Muitas vezes as pessoas se perguntam se isso quebra todas as regras do circuito, e a resposta é não. A pressão elétrica fornecida por Vdd e Vss é de 5 volts. O LED vermelho sempre usará cerca de 1,7 volts, e o resistor vai usar os restantes 3,3 volts, independentemente da sua ordem. ATIVIDADE #2: LEITURA DO BOTÃO COM O BASIC STAMP Nesta atividade, você vai ligar um circuito de botão para o BASIC Stamp mostrar se ele está ou não pressionado. Você vai fazer isso escrevendo um programa de PBASIC que verifica o estado do botão e exibe-o no DEBUG Terminal. Peças para um Circuito de Botão (1) Botão – normalmente aberto (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (1) Resistor – 10 kΩ (marrom-preto-laranja) (2) Fios Construindo o Circuito de Botão para o BASIC Stamp A Figura 3-6 mostra um circuito de botão ligado ao pino de I/O P3 do BASIC Stamp. Construindo o circuito mostrado na Figura 3-6. Página - 56 Vdd Vin X3 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vdd P3 220 Ω 10 kΩ Vss Vss Figura 3-6 Circuito de botão conectado ao pino de I/O P3 No diagrama de fiação, o resistor de 220 Ω está no lado esquerdo ligando o botão à P3, enquanto o resistor de 10 kΩ está à direita, ligando o circuito do botão à Vss. A Figura 3-7 mostra o que o BASIC Stamp vê quando o botão é pressionado e quando não é. Quando o botão é pressionado, o BASIC Stamp percebe que Vdd está ligado a P3. Dentro do BASIC Stamp, isso faz com que ele coloque o número 1 em uma parte da sua memória que armazena informações sobre os seus pinos de I/O. Quando o botão não for pressionado, o BASIC Stamp não pode sentir Vdd, mas pode sentir Vss através dos resistores 10 kΩ e 220 Ω. Isso faz com que ele armazene o número 0, no mesmo local de memória que armazena 1 quando o botão está pressionado. Vdd 220 Ω 10 kΩ SOUT 1 SIN 2 24 ATN 3 VIN 23 VSS 22 VSS 4 RES 21 P0 P1 VDD (+5V) 5 20 P15 6 19 P2 7 P14 18 P3 8 P13 17 P12 BS2 1 0 P4 9 16 P11 P5 10 15 P10 P6 11 14 P9 13 P8 P7 12 BS2-IC Vss Vdd 220 Ω 10 kΩ SOUT 1 SIN 2 24 VIN 23 ATN 3 VSS 4 VSS 22 RES 21 P0 VDD (+5V) 5 20 P15 P1 6 19 P14 P2 7 18 P13 P3 8 17 P12 P4 9 16 P11 P5 10 15 P10 P6 11 14 P9 P7 12 13 P8 BS2 1 0 Figura 3-7 BASIC Stamp lendo o botão Quando o botão está pressionado, o BASIC Stamp lê 1 (acima). Quando o botão não está pressionado o BASIC Stamp lê 0 (abaixo). BS2-IC Vss Binário e Circuitos: O sistema numérico com base-2 usa apenas os dígitos 1 e 0 para fazer números, e esses valores binários podem ser transmitidos de um dispositivo para outro. O BASIC Stamp interpreta Vdd (5 V) como um binário-1 e Vss (0 V) como um binário-0. Da mesma forma, quando o BASIC Stamp define o pino de I/O para Vdd usando HIGH, envia o binário-1. Quando defini o pino de I/O para Vss usando LOW, envia o um binário-0. Esta é uma forma usual de comunicação de números utilizada por diversos computadores, chips e outros dispositivos. Página - 57 Programando o BASIC Stamp para Monitorar o Botão O BASIC Stamp armazena um ou zero percebidos no pino de I/O P3 em um local de memória chamado IN3. Aqui está um exemplo de programa que mostra como isso funciona: Exemplo de Programa: ReadPushbuttonState.bs2 Este próximo programa faz o BASIC Stamp verificar o botão a cada ¼ de segundo e enviar o valor de IN3 ao DEBUG Terminal. A Figura 3-8 mostra o DEBUG Terminal enquanto o programa está sendo executado. Quando o botão é pressionado, o DEBUG Terminal exibe o número 1, e quando o botão não está pressionado, o DEBUG Terminal exibe o número 0. Figura 3-8 DEBUG Terminal mostrando a leitura do botão O DEBUG Terminal exibe 1 quando o botão é pressionado, e 0 quando não está pressionado. Entre com o programa ReadPushbuttonState.bs2 no BASIC Stamp Editor. Execute o programa. Verifique se o DEBUG Terminal exibe o valor 0 quando o botão não está pressionado. Verifique se o DEBUG Terminal exibe o valor 1 quando o botão é pressionado e mantido. ' O que é um Microcontrolador - ReadPushbuttonState.bs2 ' Verifique e informe, a cada 1/4 de segundo, através do DEBUG ' Terminal o estado do botão. ' {$STAMP BS2} ' {$PBASIC 2.5} DO DEBUG ? IN3 PAUSE 250 LOOP Como Funciona o ReadPushbuttonState.bs2 O DO...LOOP no programa repete a cada 1/4 de segundo por causa do comando PAUSE 250. Cada vez através do DO...LOOP, o comando DEBUG ? IN3 envia o valor de IN3 para o DEBUG Terminal. O valor de IN3 é o estado que o pino de I/O P3 percebe no instante em que o comando DEBUG é executado. Página - 58 Sua Vez – Um Botão com um Resistor pull-up O circuito que você terminou tem um resistor ligado ao Vss. Esta resistência é chamada de resistência pull-down, pois puxa a tensão no P3 até Vss (0 volts), quando o botão não está pressionado. A Figura 3-9 mostra um circuito de botão de pressão que usa uma resistência pull-up. Esta puxa o resistor de tensão até Vdd (5 volt), quando o botão não está pressionado. As regras já estão invertidas. Quando o botão não for pressionado, IN3 armazena o número 1, e quando o botão é pressionado, IN3 armazena o número 0. O resistor 220 Ω é utilizado nos exemplos de circuitos de botões de pressão para proteger o pino de I/O do BASIC Stamp. Embora seja uma boa prática para prototipagem, na maioria dos produtos este resistor é substituído por um fio (pois fios custam menos que resistores). Modifique seu circuito como mostrado na Figura 3-9. Re-execute ReadPushbuttonState.bs2. Usando o DEBUG Terminal, verifique se IN3 é 1 quando o botão não está pressionado e 0 quando o botão está pressionado. Vdd Vdd 10 kΩ P3 220 Ω Vss Vin Vss X3 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Figura 3-9 Circuito de botão modificado Baixa atividade vs. alta atividade: O botão do circuito da Figura 3-9 é chamado de atividade baixa porque manda ao BASIC Stamp um sinal de baixa (Vss) quando o botão é ativado (pressionado). O botão do circuito na Figura 3-6 é chamado de alta porque envia um sinal de alta (Vdd) quando o botão é ativado (pressionado). ATIVIDADE #3: CONTROLE POR BOTÃO DE UM CIRCUITO DE LED A Figura 3-10 mostra, em zoom, o botão de pressão e o LED usado para ajustar as configurações em um monitor de computador. Este é apenas um dos muitos dispositivos que possuem um botão que você pode pressionar para ajustar o dispositivo e um LED para mostrar o status do dispositivo. Página - 59 Figura 3-10 Botão e LED no monitor do computador O BASIC Stamp pode ser programado para tomar decisões com base no que ele sente. Por exemplo, ele pode ser programado para piscar o LED em on/off, dez vezes por segundo, quando o botão é pressionado. Peças do Circuito de LED e Botão (1) Botão – normalmente aberto (1) Resistor – 10 kΩ (marrom-preto-laranja) (1) LED – qualquer cor (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (1) Resistor – 470 Ω (amarelo-violeta-marrom) (2) Fios Construindo o Circuito de LED e Botão A Figura 3-11 mostra o circuito de botão usado na atividade que você acabou de terminar junto do circuito de LED utilizado na Atividade #2 do Capítulo 2. Construa o circuito mostrado na Figura 3-11. P14 470 Ω LED Vdd X3 Vss Vdd P3 220 Ω 10 kΩ Vss P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vin Vss + Figura 3-11 Circuito de LED e botão Programando o Controle do Botão O BASIC Stamp pode ser programado para tomar decisões usando as declarações IF...THEN...ELSE. O programa de exemplo que você vai executar irá piscar o LED on e off quando o botão for pressionado. Cada vez através do DO...LOOP, as Página - 60 declarações IF...THEN...ELSE verificam o estado do botão e decidem se o LED deve piscar ou não. Exemplo de Programa: PushbuttonControlledLed.bs2 Entre com o PushbuttonControlledLed.bs2 no BASIC Stamp Editor e execute-o. Verifique se o LED pisca on e off enquanto o botão é pressionado e mantido pressionado. Verifique se o LED não piscará quando o botão não estiver pressionado. ' O que é um Microcontrolador - PushbuttonControlledLed.bs2 ' Verifique o estado do botão 10 vezes por segundo e faça o LED piscar ' quando pressionado. ' {$STAMP BS2} ' {$PBASIC 2.5} DO DEBUG ? IN3 IF (IN3 = 1) THEN HIGH 14 PAUSE 50 LOW 14 PAUSE 50 ELSE PAUSE 100 ENDIF LOOP Como Funciona o PushbuttonControlledLed.bs2 Este programa é uma versão modificada do ReadPushbuttonState.bs2 da atividade anterior. Os comandos DO ... LOOP e DEBUG? IN3 são os mesmos. O comando PAUSE 250 foi substituído por uma declaração IF...THEN...ELSE. Quando a condição após o IF é verdadeira (IN3 = 1), os comandos que vêm após a declaração THEN, são então executados. Eles serão executados até que a declaração ELSE seja atingida, ponto no qual o programa salta para ENDIF e segue em frente. Quando a condição do IF não é verdadeira (IN3 = 0), os comandos da instrução ELSE são executados até ENDIF ser atingido. Você pode fazer uma lista detalhada do que um programa deve fazer, isso ajudará a planejar o programa ou descrever o que ele faz. Esse tipo de lista é chamado de pseudocódigo, e o exemplo abaixo usa pseudo-código para descrever como o PushbuttonControlledLed.bs2 funciona. o Faz com que os comandos a partir daqui até a declaração de Loop se repitam indefinidamente. o Mostra o valor de IN3 no DEBUG Terminal. o Se (If) o valor de IN3 for 1, então (Then) Acende o LED Página - 61 Espera 1/20 de segundo Apaga o LED Espero 1/20 de segundo o Se não (Else) (se o valor de IN3 for 0) Não faz nada, mas espera a mesma quantia de tempo que levaria para o LED piscar rapidamente (1/10 de segundo). o Loop Sua Vez – Mais Rápido/Mais Devagar Salve o programa de exemplo com um nome diferente. Modifique o programa para que o LED pisque duas vezes mais rápido, quando você pressionar e segurar o botão. Modifique o programa para que o LED pisque duas vezes mais devagar, quando você pressionar e segurar o botão. ATIVIDADE #4: DOIS BOTÕES CONTROLANDO DOIS DOS CIRCUITOS DE LED Vamos adicionar um segundo botão para o projeto e ver como ele funciona. Para tornar as coisas um pouco mais interessantes, vamos também adicionar um segundo circuito de LED e usar o segundo botão para controlá-lo. Peças do Circuito de LED e Botão (2) Botão – normalmente aberto (2) Resistores – 10 kΩ (marrom-preto-laranja) (2) Resistores – 470 Ω (amarelo-violeta-marrom) (2) Resistores – 220 Ω (vermelho-vermelho-marrom) (2) LEDs – qualquer cor (3) Fios Adicionando um Botão e um Circuito de LED A Figura 3-12 mostra um segundo circuito de LED e botão adicionados ao circuito que você testou na atividade anterior. Construa o circuito mostrado na Figura 3-12. Se você precisar de ajuda para construir o circuito mostrado no esquema, use o diagrama de fiação na Figura 313 como guia. Modifique ReadPushbuttonState.bs2 para que ele leia IN4 em vez de IN3, e use isso para testar o segundo botão do circuito. Página - 62 P15 470 Ω P14 470 Ω LED LED Vss Vss Vdd Vdd Figura 3-12 Esquema para circuito de dois botões e LEDs P4 220 Ω P3 220 Ω 10 kΩ Vss 10 kΩ Vss Pontos que indicam conexões: Existe, na Figura 3-12, três locais onde os fios se intersectam, mas apenas dois pontos. Os fios estão conectados apenas se há um ponto na intersecção. O fio que conecta o botão ligado a P4 ao resistor de 10 kΩ, não está conectado ao circuito do botão ligado a P3 porque não há nenhum ponto indicando essa conexão. Vdd X3 Vin Vss ++ P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Figura 3-13 Diagrama de fiação de dois botões e LEDs Programando o Controle do Botão Na atividade anterior, você fez uma experiência ao tomar decisões de usar uma instrução IF...THEN...ELSE. Também existe tal coisa com um IF...ELSEIF...ELSE. Ele funciona muito bem para decidir quais LEDs piscarão e desligarão. O seguinte programa de exemplo mostra como ele funciona. Exemplo de Programa: PushbuttonControlOfTwoLeds.bs2 Coloque e execute PushbuttonControlOfTwoLeds.bs2 no BASIC Stamp Editor. Verifique se o circuito de LED conectado à P14 piscará on e off quando o botão no circuito conectado à P3 é pressionado. Página - 63 Também verifique se o LED no circuito ligado à P15 pisca quando o botão do circuito conectado à P4 é pressionado. ' ' ' ' O que é um Microcontrolador- PushbuttonControlOfTwoLeds.bs2 Faça o LED ligado a P14 piscar quando o botão ligado a P3 for pressionado e o LED ligado a P15 piscar quando o botão ligado a P4 for pressionado. ' {$STAMP BS2} ' {$PBASIC 2.5} PAUSE 1000 DO DEBUG HOME DEBUG ? IN4 DEBUG ? IN3 IF (IN3 = 1) THEN HIGH 14 PAUSE 50 ELSEIF (IN4 = 1) THEN HIGH 15 PAUSE 50 ELSE PAUSE 50 ENDIF LOW 14 LOW 15 PAUSE 50 LOOP Como Funciona o PushbuttonControlOfTwoLeds.bs2 Se a exibição de IN3 e IN4 rolou para baixo o DEBUG Terminal, como aconteceu no exemplo anterior, será difícil de ler. Uma maneira de corrigir isso é sempre enviar o cursor para o topo à esquerda no DEBUG Terminal usando o caractere de controle HOME: DEBUG HOME Enviar o cursor para a posição inicial sempre através do DO...LOOP, os comandos: DEBUG ? IN4 DEBUG ? IN3 ... exibem os valores de IN4 e IN3 sempre na mesma parte do DEBUG Terminal. A palavra-chave DO começa o loop neste programa: DO Estes comandos na instrução IF são os mesmos que os do programa de exemplo da atividade anterior: Página - 64 IF (IN3 = 1) THEN HIGH 14 PAUSE 50 É aqui que a palavra-chave ELSEIF o ajudará. Se IN3 não é 1, mas IN4 é 1, queremos que o LED esteja ligado ao P15 em vez de estar ligado ao P14. ELSEIF (IN4 = 1) THEN HIGH 15 PAUSE 50 Se nenhuma das afirmações for verdadeira, e ainda quisermos fazer uma pausa por 50 ms, sem alterar o estado de todos os circuitos de LED. ELSE PAUSE 50 Quando você terminar com todas as decisões, não se esqueça do ENDIF. ENDIF É hora de desligar os LEDs e pausar novamente. Você poderia decidir qual LED ligou e desligá-lo. Comandos do PBASIC são executados de forma muito rápida, então por que não deixá-los desligados e esquecer sobre elaborar mais decisões? LOW 14 LOW 15 PAUSE 50 A declaração LOOP enviará o programa de volta para a declaração DO, e todo o processo de checagem dos botões e mudança do estado dos LEDs começará novamente. LOOP Sua Vez – Que Tal Pressionar os dois Botões? O exemplo de programa tem uma falha. Tente pressionar ambos os botões ao mesmo tempo e você verá a falha. Seria esperado que ambos os LEDs piscassem on e off, mas isto não acontece, pois somente um bloco de código IF...ELSEIF...ELSE será executado antes que vá ao ENDIF. Aqui está como você pode corrigir esse problema: Salve PushbuttonControlOfTwoLeds.bs2 com um nome diferente. Substitua a declaração IF e o bloco de código: IF (IN3 = 1) THEN HIGH 14 PAUSE 50 ...com a declaração IF...ELSEIF: Página - 65 IF (IN3 = 1) AND (IN4 = 1) THEN HIGH 14 HIGH 15 PAUSE 50 ELSEIF (IN3 = 1) THEN HIGH 14 PAUSE 50 Um bloco de código é um grupo de comandos. A instrução IF acima tem um bloco de código com três comandos (HIGH, HIGH e PAUSE). A declaração ELSEIF tem um bloco de código com dois comandos (HIGH, PAUSE). Execute ou modifique o programa e observe como ele lida com botão pressionado e se os resultados dos circuitos de LED saíram como esperado. A palavra chave AND pode ser usada nas declarações IF...THEN para checar se há mais condições verdadeiras. Todas as condições com AND têm que ser verdadeiras para a declaração IF ser verdadeira. A palavra chave OR pode também ser usada para checar se pelo menos uma das condições é verdadeira. Você pode também modificar o programa para que os LEDs pisquem on em diferentes quantidades de tempo. Por exemplo, você pode reduzir o argumento Duration do comando PAUSE a 10 para ambos os botões, aumentando o PAUSE do LED P14 para 100, e o PAUSE do LED P15 para 200. Modifique o comando PAUSE do IF e as duas declarações ELSEIF como foram discutidas. Execute o programa modificado. Observe a diferença no comportamento de cada luz. ATIVIDADE #5: TESTE DE TEMPO DE REAÇÃO Você é um engenheiro de sistemas e trabalha em uma empresa de vídeo games. O departamento de Marketing recomenda que seja adicionado um circuito, no próximo controle de um jogo de mão, para testar o tempo de reação do jogador. Sua próxima tarefa será desenvolver um prova de conceito para o teste de tempo de reação. A solução que você irá construir e testar nessa atividade é um exemplo de como solucionar o problema, mas não é definitivamente a única solução. Antes de continuar, tire um momento para pensar como deve ser projetada esse medidor de tempo de reação. Peças do Medidor de Tempo de Reação (1) LED – bicolor (1) Resistor – 470 Ω (amarelo-violeta-marrom) (1) Botão – normalmente aberto Página - 66 (1) Resistor – 10 kΩ (marrom-preto-laranja) (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (2) Fios Construindo o Circuito do Medidor de Tempo de Reação A Figura 3-14 mostra um diagrama esquemático de fiação para um circuito que pode ser utilizado com o BASIC Stamp para fazer um medido de tempo de reação. Construa o circuito mostrado na Figura 3-14 da página 66. Execute TestBiColorLED.bs2 da Atividade #5 do Capítulo 2 para testar o circuito de LED bicolor e ter certeza de que a fiação está correta. Se você apenas reconstruir o circuito de botão para essa atividade, execute ReadPushbuttonState.bs2 da Atividade #2 deste capítulo para ter certeza que seu botão está funcionando corretamente. P15 1 1 2 Vdd P14 470 Ω Vdd P3 220 Ω 10 kΩ Vin Vss X3 2 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Figura 3-14 Circuito de reação de tempo Vss Programando o Medidor de Tempo de Reação O programa de exemplo seguinte é fará com que o LED bicolor off até que o jogador pressione e segure o botão. Quando o botão for pressionado, o LED ficará vermelho por um curto período de tempo. Quando o LED ficar verde, o jogador tem que soltar o botão o mais rápido que puder. O programa medirá o tempo necessário entre o LED ficar verde e o botão ser solto. O programa de exemplo também demonstra como o captador e o contador funcionam. Captação é o processo de verificação se alguma coisa foi mudada, de modo muito rápido repetidas vezes. Contagem é o processo de adicionar um número a uma variável cada vez que algo acontece (ou não). Neste programa, o BASIC Stamp vai pesquisar a partir do momento que o LED bicolor ficar verde até que o botão seja solto. Ele vai esperar 1/1000 de um segundo, usando o comando PAUSE 1. Cada vez que ele capta e o botão não é liberado, ele adiciona 1 à variável de contagem chamada timeCounter. Quando o botão é solto, o programa para a captação e envia uma mensagem para o DEBUG Terminal que exibe o valor da variável timeCounter. Exemplo de Programa: ReactionTimer.bs2 Coloque e execute ReactionTimer.bs2. Siga as instruções no DEBUG Terminal (ver a Figura 3-15). Página - 67 Figura 3-15 Instruções no DEBUG Terminal da reação de tempo do jogo. ' O que é um Microcontrolador - ReactionTimer.bs2 ' Teste o tempo de reação com um botão e um LED bicolor. ' {$STAMP BS2} ' {$PBASIC 2.5} PAUSE 1000 timeCounter ' Espera 1 segundo antes da ' primeira menssagem. VAR Word ' Declara variável para armazenar ' o tempo. DEBUG "Aperte e segure o botão", CR, ' Exibe as instruções de reação. "para fazer a luz ficar vermelha.", CR, CR, "Quando a luz ficar verde, solte", CR, "o botão o mais rápido possível.", CR, CR DO ' Inicia o loop principal. DO LOOP UNTIL IN3 = 1 ' Loop repete... ' Até o botão ser pressionado. HIGH 14 LOW 15 ' LED bicolor vermelho. PAUSE 1000 ' Atrasa 1 segundo. LOW 14 HIGH 15 ' LED bicolor verde. timeCounter = 0 ' Define timeCounter para zero. DO ' Loop, conta o tempo... PAUSE 1 timeCounter = timeCounter + 1 LOOP UNTIL IN3 = 0 ' Até que o botão seja solto. LOW 15 ' LED bicolor desligado. DEBUG "Seu tempo foi ", DEC timeCounter, ' Exibe medição de tempo. " ms.", CR, CR, Página - 68 "Para jogar novamente,", CR, ' Mostra instruções novamente. "pressione o botão mais uma vez.", CR, CR LOOP ' Volta para início do loop ' principal. Como Funciona o ReactionTimer.bs2 Como o programa deve manter o controle do número de vezes que o botão foi pressionado, uma variável chamada timeCounter é declarada. timeCounter VAR para armazenar Word ' Declara variável ' o tempo. Variáveis iniciadas com zero: Quando a variável é declarada no PBASIC, este valor é automaticamente zero até que o comando mostre um novo valor. O comando DEBUG contém instruções para o jogador. DEBUG "Aperte e segure o botão", CR, "para fazer a luz ficar vermelha.", CR, CR, "Quando a luz ficar verde, solte", CR, "o botão o mais rápido possível.", CR, CR As declarações DO...LOOP podem ser assentadas. Em outras palavras, você pode colocar um DO...LOOP dentro de outro. DO ' Inicia o loop principal. DO ' Loop repete... LOOP UNTIL IN3 = 1 ' Até o botão ser pressionado. ' Pausa do progama estava localizada aqui. LOOP ' Volta para início do loop ' principal. Faça com que a parte interna do DO...LOOP mereça mais atenção. O DO...LOOP pode usar uma condição para decidir se deve ou não se deve sair do loop e passar para os comandos que virão depois.. O DO...LOOP se repetirá enquanto o botão não for pressionado (IN3 = 0). O DO ... LOOP será executado repetidas vezes, até que IN3 seja = 1. Então, o programa passa para o próximo comando após a declaração LOOP UNTIL. Este é um exemplo de captação. O DO...LOOP..UNTIL ficará enquanto o botão estiver pressionado. DO LOOP UNTIL IN3 = 1 ' Loop repete... ' Até o botão ser pressionado. Os comandos que surgem imediatamente após a declaração LOOP UNTIL acenderão o LED bicolor vermelho, o atraso de um segundo fará com que o verde acenda. Página - 69 HIGH 14 LOW 15 ' LED bicolor vermelho. PAUSE 1000 ' Atrasa 1 segundo. LOW 14 HIGH 15 ' LED bicolor verde. Assim que o LED bicolor ficar verde, é hora de começar a contagem para acompanhar quanto tempo o jogador demora para soltar o botão. A variável timeCounter está definida em zero, depois outro DO ... LOOP com uma condição UNTIL começa a se repetir. Ele se repete até que o jogador solte o botão (IN3 = 0). Cada vez através do loop, o BASIC Stamp atrasará 1 ms usando PAUSE 1, e também adiciona 1 ao valor da variável timeCounter. timeCounter = 0 ' Define timeCounter para zero. DO ' Loop, conta o tempo... PAUSE 1 timeCounter = timeCounter + 1 LOOP UNTIL IN3 = 0 ' Até que o botão seja solto. Depois que o botão é liberado, o LED bicolor estará desligado. LOW 15 Os resultados são exibidos no DEBUG Terminal. DEBUG "Seu tempo foi ", DEC timeCounter, " ms.", CR, CR, "Para jogar novamente,", CR, "pressione o botão mais uma vez.", CR, CR A última declaração no programa é LOOP, que envia o programa de volta para a primeira declaração DO. Sua Vez – Revisão do Projeto (Tópicos Avançados) O departamento de marketing deu o seu protótipo para alguns testadores de jogos. Quando os testes dos jogos tiverem sido feitos, o departamento de marketing entregará para você uma lista detalhada com os três problemas que deverão ser solucionados antes que seu protótipo possa ser inserido em um controlador de jogos. Salve ReactionTimer.bs2 ReactionTimerYourTurn.bs2). com um novo nome (como A "lista detalhada" de problemas e suas soluções são discutidas abaixo. Item 1: Quando um jogador segura o botão durante 30 segundos, a sua pontuação fica em torno de 14,000 ms, uma medição de 14 segundos. Isso tem que ser corrigido! Página - 70 Acontece que a execução do próprio circuito, juntamente com a adição de uma variável timeCounter leva cerca de 1 ms, sem o comando PAUSE 1. Isto é chamado de sobrecarga de código (code overhead), e é a quantidade de tempo que o BASIC Stamp leva para executar os comandos. Uma solução rápida, que vai melhorar a precisão, é simplesmente comentar o comando PAUSE 1 adicionando um apóstrofo à esquerda dele. ' PAUSE 1 Tente comentar PAUSE 1 e teste para ver a precisão do programa. Em vez de comentar o atraso, outra maneira de corrigir o programa é multiplicar os resultados por dois. Por exemplo, antes que o comando DEBUG exiba o número de ms, você pode inserir um comando que multiplicará o resultado por dois: timeCounter = timeCounter * 2 ' <- Adicione isso DEBUG "Seu tempo foi ", DEC timeCounter, " ms.", CR, CR Apague o apóstrofo do comando PAUSE e tente multiplicar por dois e terá uma solução. Para precisão, você pode usar operador o * / para multiplicar por um valor com uma fração. O operador * / não é difícil de usar, veja como: 1. Coloque o valor ou variável que você deseja multiplicar por um valor fracionário perante o operador */. 2. Pegue o valor fracionário que você deseja usar e multiplique por 256. 3. Livre-se de qualquer coisa à direita do ponto decimal. 4. Coloque esse valor após o operador */. Exemplo: Digamos que você deseja multiplicar a variável timeCounter por 3,69. 1. Comece colocando timeCounter a esquerda do operador */ : timeCounter = timeCounter */ 2. Multiplique seu valor fracional de 256: 3.69 x 256 = 944.64. 3. Arredondando: 944.64 ≈ 945. 4. Coloque o valor à direita do operador */: timeCounter = timeCounter */ 945 por 3,69” ' multiplica A multiplicação por 2 vai dimensionar um resultado de 14.000 a 28.000, que é aproximadamente 30.000. 30,000 ÷ 14,000 ≈ 2.14. Para multiplicar por 2,14, com o operador * / é preciso descobrir quantos 1/256 estão em 2.14 para maior precisão. Então, 2,14 x 256 = 547,84 ≈ 548. Você pode usar esse valor e o operador */ para substituir timecounter = timeCounter * 2. Página - 71 Substitua timeCounter = timeCounter timeCounter */ 548 e teste * 2 por timeCounter novamente o = programa. Seus 30 segundos de teste com o programa original, sem modificações, podem produzir um valor que é um pouco diferente de 14000. Se isso acontecer, você pode usar o mesmo procedimento com os resultados do teste para calcular um valor para o operador */ para obter resultados ainda mais precisos. Tente isso! Item 2: Jogadores logo descobriram que o atraso de vermelho para verde é de 1 segundo. Depois de jogar várias vezes, eles são capazes de prever quando soltar, e sendo assim, sua pontuação já não reflete o tempo real de reação. O BASIC Stamp tem um comando RANDOM. Aqui está como modificar seu código para usar um número aleatório. No início do seu código, adicionar a declaração de uma nova variável chamada value e configurá-lá para 23. O valor de 23 é denominado seed, porque ele começa a sequência de números pseudo-aleatórios. timeCounter VAR Word value VAR Byte value = 23 ' <- Adicione isso ' <- Adicione isso Antes do comando PAUSE 1000 dentro do DO...LOOP, use o comando RANDOM para atribuir um valor a um novo valor aleatório a partir da seqüência pseudo-aleatória, que começou com 23. RANDOM value ' <- Adicione isso DEBUG "Tempo de atraso", ? 1000 + value, CR ' <- Adicione isso Modifique o comando PAUSE 1000 para que o valor "random" seja adicionado ao seu argumento Duration. PAUSE 1000 + value ' <- Modifique isso LOW 14 HIGH 15 Uma vez que o maior valor que um byte pode armazenar é 255, o comando PAUSE varia somente por ¼ segundo. Você pode multiplicar o valor da variável por 4 para fazer o atraso da luz vermelha alternar de 1 para pouco mais de 2 segundos. DEBUG "Tempo de atraso", ? 1000 + (value*4), CR ' <- Modifique PAUSE 1000 + (value * 4) ' <- Modifique isso ' novamente Página - 72 O que é um algoritmo? Um algoritmo é uma sequência de operações matemáticas. O que é pseudo-aleatório? Meios pseudo-aleatório parecem aleatórios, mas não são na verdade. Cada vez que você iniciar o programa novamente, você terá a mesma seqüência de valores. O que é um seed? Um seed é um valor que é utilizado para iniciar uma sequência de pseudo-aleatórios. Se você usar um valor diferente para seed (alteração de valor entre 23 e algum outro número), irá resultar em uma seqüência diferente pseudo-aleatórios. Item 3: Um jogador que solta o botão antes da luz ficar verde receberá uma pontuação excessivamente boa (1 ms). Seu microcontrolador precisa descobrir se o jogador está a trapaceando. O pseudo-código foi introduzido neste capítulo no final da Atividade #3. Aqui está um pseudo-código para ajudá-lo a aplicar uma declaração IF...THEN...ELSE para resolver o problema. Supondo que você tenha feito as outras alterações nos itens 1 e 2, timeCounter será agora 2 em vez de 1 se o jogador soltar o botão antes da luz ficar verde. As mudanças abaixo funcionarão se timeCounter for 1 ou 2. • • • • • Se o valor de timeCounter é menor ou igual a 2 (timeCounter <= 2) o Mostra uma mensagem que diz ao jogador que ele deve esperar até depois que a luz fique verde para soltar o botão. Logo, (se o valor de timeCounter for maior do que 1) Mostra o valor do tempo de timeCounter (assim como em ReactionTimer.bs2) em ms. End If Mostra a mensagem para jogar novamente Modifique seu programa implementando esse pseudocódigo no PBASIC para corrigir o problema de um jogador trapaceiro. Página - 73 SUMÁRIO Este capítulo introduziu o botão e alguns circuitos de botão comuns. Este capítulo também apresentou como construir e testar um circuito de botão e como usar o BASIC Stamp para ler o estado de um ou mais botões. O BASIC Stamp foi programado para tomar decisões com base no estado dos botões e esta informação foi usada para controlar os LEDs. Um temporizador de reação de jogo foi construído usando esses conceitos. Além de controlar os LEDs, o BASIC Stamp foi programado para captar o botão e fazer as medições de tempo. Vários conceitos de programação foram introduzidos, incluindo contagem, pseudocódigo para planejamento de fluxo de programa, sobrecarga de código em aplicações sensíveis ao tempo, e os valores de seeds para eventos pseudo-aleatórios. Foi introduzida a leitura de circuitos de botões individuais usando as variáveis especiais de E / S incorporadas ao BASIC Stamp (IN3, IN4, etc). Também foram introduzidas tomadas de decisões com base nesses valores usando IF...THEN...ELSE, IF...ELSEIF...ELSE, blocos de código e operadores AND e OR para avaliar mais de uma condição. Adicionando uma condição para o DO...LOOP usando a palavra-chave UNTIL foi introduzido junto com o assentamento de blocos de código DO...LOOP. O comando RANDOM foi apresentado ao adicionar um elemento de imprevisibilidade de um aplicativo, a reação de tempo de jogo. Questões 1. Qual é a diferença entre o envio e recepção de sinais HIGH e LOW usando o BASIC Stamp? 2. O que significa "normalmente aberto", quando diz respeito a um botão? 3. O que acontece entre os terminais de um botão normalmente abertos quando você os pressiona? 4. Qual é o valor de IN3 quando um botão é ligado ao Vdd? Qual é o valor de IN3 quando um botão é ligado ao Vss? 5. O que faz o comando DEBUG ? IN3? 6. Que tipo de blocos de código podem ser utilizados para tomar decisões com base no valor de um ou mais botões? 7. O que faz o caractere HOME control na declaração DEBUG HOME? Exercícios 1. Explicar como modificar ReadPushbuttonState.bs2 na página 57 para que ele leia o botão a cada segundo, em vez de a cada ¼ de segundo. 2. Explicar como modificar ReadPushbuttonState.bs2 para que ele leia um circuito de botão normalmente aberto com um resistor pull-up ligado ao pino de I/O P6. Projeto 1. Modifique ReactionTimer.bs2 para ele seja um jogo para dois jogadores. Adicione um segundo botão ligado a P4 para o segundo jogador. Soluções Q1.Enviando o BASIC Stamp para usar pino de I/O como uma saída, enquanto receptor usa o pino de I/O como entrada. Página - 74 Q2.Normalmente aberto significa que o estado normal do botão (não pressionado) forma um circuito aberto. Q3.Quando pressionada, a distância entre os terminais é uma ponte para um condutor de metal. A corrente pode então fluir através do botão de pressão. Q4. IN3 = 1 quando o botão estiver ligado a Vdd. IN3 = 0 quando o botão estiver ligado a Vss. Q5.DEBUG ? IN3 apresenta o texto "IN3 =", seguido pelo valor armazenado no IN3 (0 ou 1 dependendo do estado do pino de I/O P3), seguido por um retorno de transporte. Q6.IF...THEN...ELSE and IF...ELSEIF...ELSE. Q7.O caractere HOME control envia o cursor para a posição superior esquerda no DEBUG Terminal. E1. O DO...LOOP no programa se repete a cada ¼ de segundo, devido ao comando PAUSE 250. Para repetir a cada segundo, mude o PAUSE 250 (250 ms = 0,25 s = ¼ s), para PAUSE 1000 (1000 ms = 1 s). DO DEBUG ? IN3 PAUSE 1000 LOOP P1. Substitua IN3 por IN6, para ler o pino de I/O P6. O programa só exibe a posição do botão de estado, e não usa o valor para tomar decisões, o que não importa se o resistor é um pull-up ou pull-down. O comando DEBUG irá exibir a posição do botão de qualquer maneira. DO DEBUG ? IN6 PAUSE 250 LOOP Primeiro, um botão foi adicionado para o segundo jogador, ligado ao pino de I/O P4 no BASIC Stamp. O esquema baseia-se na Figura 3-14. Vdd P15 1 P4 220 Ω 10 kΩ 2 P14 470 Ω Vss Vdd P3 220 Ω 10 kΩ Vss Fragmentos do programa de solução estão incluídos abaixo, mas mantenha em mente que soluções podem ser codificadas de várias maneiras. No entanto, a maioria das soluções deverá incluir as seguintes modificações: Página - 75 Use duas variáveis para manter o controle de tempo dos dois jogadores: timeCounterA VAR Word ' Tempo de pontuação do jogador A timeCounterB VAR Word ' Tempo de pontuação do jogador B Altere as instruções para mostrar dois botões: DEBUG "Pressione e segure os botões", CR, DEBUG "Pressione os botões novamente.", CR, CR Espere para que ambos os botões sejam pressionados antes do LED ficar vermelho, usando o operador AND: LOOP UNTIL (IN3 = 1) AND (IN4 = 1) Aguarde os dois botões serem lançados para finalizar o tempo , usando mais uma vez o operador AND: LOOP UNTIL (IN3 = 0) AND (IN4 = 0) Adicione lógica que decide quando o tempo do jogador é incrementado: IF (IN3 = 1) THEN timeCounterA = timeCounterA + 1 ENDIF IF (IN4 = 1) THEN timeCounterB = timeCounterB + 1 ENDIF Mude o tempo de exibição que mostra o tempo de ambos jogadores: DEBUG "Player A Time: DEBUG "Player B Time: ", DEC timeCounterA, " ms. ", CR ", DEC timeCounterB, " ms. ", CR, CR Adicione lógica que mostra qual jogador que teve o tempo de reação mais rápido: IF (timeCounterA < timeCounterB) THEN DEBUG "Jogador A é o vencedor!", CR ELSEIF (timeCounterB < timeCounterA) THEN DEBUG "Jogador B é o vencedor!", CR ELSE DEBUG "Empate!", CR ENDIF A solução completa é mostrada abaixo. ' ' ' ' ' ' O que é um Microcontrolador - Ch03Prj01_TwoPlayerReactionTimer.bs2 Teste o tempo de reação com um botão e um LED bicolor. Adicione um segundo botão para outro jogador. Os jogadores jogam ao mesmo tempo usando o mesmo LED. O que soltar mais rápido ganha. Pino P3: Botão do Jogador A, Ativo High Pino P4: Botão do Jogador B, Ativo High ' {$STAMP BS2} Página - 76 ' {$PBASIC 2.5} timeCounterA VAR timeCounterB VAR PAUSE 1000 Word Word ' Pontuação de tempo jogador A ' Pontuação de tempo jogador B ' 1 s antes da 1a mensagem DEBUG "Press and hold pushbuttons", CR, ' Exibe instruções "to make light turn red.", CR, CR, ' de reação. "When light turns green, let", CR, "go as fast as you can.", CR, CR DO ' Inicia loop principal. DO ' Loop até nada ser pressionado. LOOP UNTIL (IN3 = 1) AND (IN4 = 1) HIGH 14 LOW 15 ' LED bicolor vermelho. PAUSE 1000 ' Atrasa 1 segundo. LOW 14 HIGH 15 ' LED bicolor verde. timeCounterA = 0 timeCounterB = 0 ' Define timeCounters para zero. DO PAUSE 1 IF (IN3 = 1) THEN ' Se o botão ainda estiver timeCounterA = timeCounterA + 1' pressionado, incrementa counter ENDIF IF (IN4 = 1) THEN timeCounterB = timeCounterB + 1 ENDIF LOOP UNTIL (IN3 = 0) AND (IN4 = 0) LOW 15 ' Loop até os dois botões serem ' soltos. ' LED bicolor apagado. DEBUG "Tempo do Jogador A: ", DEC timeCounterA, " ms. ", CR DEBUG "Tempo do Jogador B: ", DEC timeCounterB, " ms. ", CR, CR IF (timeCounterA < timeCounterB) THEN DEBUG "Jogador A é o vencedor!", CR ELSEIF (timeCounterB < timeCounterA) THEN DEBUG "Jogador B é o vencedor!", CR ELSE ' Tempos de A & B são iguais DEBUG "Empate!", CR ENDIF DEBUG CR DEBUG "To play again, hold the ", CR ' Intruções para jogar de novo. DEBUG "buttons down again.", CR, CR LOOP ' Retorna ao início do loop ' principal. Página - 77 Capítulo 4: Controle de Movimento MOVIMENTO MICROCONTROLADO Microcontroladores fazem, no dia a dia, os objetos ao seu redor, se deslocarem para o lugar certo. Se você tiver uma impressora jato de tinta, o cabeçote de impressão que ao imprimir vai e volta ao longo da página, é movido por um motor de passo controlado por um microcontrolador. As portas automáticas de supermercado que são abertas quando você passa são controladas por microcontroladores, e o recurso de ejeção automática no seu leitor de DVD também é controlado por um microcontrolador. SINAIS DE ON/OFF E MOVIMENTOS DO MOTOR Praticamente todos os motores microcontrolados recebem sequências de sinais de alta e baixa semelhantes aos que você envia para os LEDs. A diferença é que o microcontrolador envia esses sinais a taxas que são geralmente muito mais rápidas do que os exemplos de LED que piscam, mencionados no Capítulo 2. Se você tivesse que usar um circuito de LED para monitorar sinais de controle, alguns fariam a cintilação LED on/off tão rapidamente que o olho humano não conseguiria detectar a mudança. O LED só iria parecer que brilha fracamente. Outros apareceriam como um rápido lampejo, e outros seriam mais facilmente discerníveis. Alguns motores requerem vários de circuitos que ajudam o microcontrolador a funcionar. Outros motores necessitam de peças mecânicas extras para fazê-los funcionar, corretamente, em máquinas. De todos os diferentes tipos de motores, começando com o servo hobby que você vai experimentar neste capítulo é provavelmente o mais simples. Como você verá em breve, é fácil controlá-lo com o BASIC Stamp, pois requer poucos ou nenhum circuito adicional, e tem uma saída mecânica que facilita a conexão com os objetos ao movimentá-los. INTRODUZINDO O SERVO O servo hobby é um dispositivo que controla a posição, e você pode encontrá-lo em praticamente qualquer carro controlado por rádio (RC), barco ou avião. Em carros com RC, o servo mantém a direção para controlar a forma como o carro drasticamente gira. Em um barco de RC, ele detém o leme na posição de voltas. Aviões com RC têm normalmente vários servos posicionando as diferentes abas para controlar o movimento do avião. Em veículos com RC com motores movidos a gás, outro servo move a alavanca do acelerador do motor para controlar o quão rápido o motor funciona. Um exemplo de um avião com RC e de seu controlador de rádio são mostrados na figura 41. Os amadores "voam" o avião através da manipulação do leme com o polegar no controlador de rádio, fazendo com que os servos no avião controlem a posição das abas e do leme do avião com RC. Página - 78 Figura 4-1 Modelo de Avião e Controlador de Rádio Então, como será segurando o leme do controlador de rádio em uma determinada posição provocando a aba do avião com RC para se manter em uma determinada posição? O controlador de rádio converte a posição de uma das alavancas em pulsos de radioatividade que duram uma determinada quantidade de tempo. O tempo final de cada indica a posição de um dos joysticks. No avião com RC, um receptor de rádio converte esses pulsos de atividade de rádio em pulsos digitais (sinais de alta/baixa) e os envia para os servos do avião. Cada servo tem, em seu interior, um circuito que converte esses pulsos digitais para uma posição, que o servo mantém. A quantidade de tempo de cada pulso tem uma duração que diz que posição o servo deve manter. Esses pulsos de controle duram apenas alguns milésimos de segundo, e são repetidos em torno de 40 a 50 vezes por segundo para que o servo mantenha a posição. A Figura 4-2 mostra o desenho de um servo padrão da Parallax. A tomada (1) é utilizada para ligar o servo a uma fonte de energia (Vss e Vdd) e a uma fonte de sinal (um pino de I/O do BASIC Stamp). O cabo (2) tem três fios, e conduz Vdd, Vss e a linha de sinal da tomada no servo. O horn (3) é a parte do servo que se parece com uma estrela de quatro pontas. Quando o servo está em execução, o horn é a peça móvel que mantém o servo em diferentes posições. O parafuso Phillips (4) mantém o horn no eixo de saída do servo. A caixa (5) contém o sensor de posição do servo e os circuitos de controle, um motor DC e engrenagens. Estas partes trabalham juntas para levar sinais de alta/baixa do BASIC Stamp e traduzi-los em posições detidas pelo horn do servo. Página - 79 2 Figura 4-2 Servo Padrão Parallax 3 1 (1) Tomada (2) Cabo (3) Horn (4) Parafuso que prende o horn no eixo de saída do servo (5) Caixa 4 5 Neste capítulo, você vai programar o BASIC Stamp para enviar sinais que controlam a posição do horn do servo ao servo. Ao fazer o BASIC Stamp enviar sinais que dizem ao servo que mantenha diferentes posições, seus programas também podem orquestrar o movimento do servo. Seus programas podem, até mesmo, monitorar botões e usar informações enquanto os botões são pressionados para ajustar a posição que o servo mantém (botão de controle da posição do servo). O BASIC Stamp também pode ser programado para receber as mensagens que você digitar no DEBUG Terminal e usar essas mensagens para controlar a posição do servo (posição de controle do terminal do servo). ATIVIDADE #1: CONECTANDO E TESTANDO O SERVO Nesta atividade, você vai seguir instruções para conectar um servo à fonte de alimentação de sua própria placa e do BASIC Stamp. Servo e Peças do Circuito de LED (1) Servo padrão da Parallax (1) Resistor – 470 Ω (amarelo-violeta-marrom) (1) LED – Qualquer cor O circuito de LED será utilizado para monitorar o sinal de controle que o BASIC Stamp envia para o servo. Tenha em mente que o circuito de LED não é necessário para ajudar o servo operar. Ele está ali apenas para ajudar a "ver" os sinais de controle. CUIDADO: Utilize apenas o servo padrão da Parallax para as atividades neste texto! Outros servos podem ser projetados para diferentes especificações que podem não ser compatíveis com essas atividades. Página - 80 Construindo os Servos e Circuitos de LED No Capítulo 1, você identificou e atualizou sua placa usando a ajuda do BASIC Stamp Editor. Você vai precisar saber qual placa e atualização que você tem aqui para que você possa encontrar as instruções de construção do circuito de servo para a sua placa. Se você ainda não sabe qual placa e atualização que possui, abra a ajuda do BASIC Stamp Editor, vá pra a página inicial e clique em Primeiros Passos (Getting Started) com Stamps in Class. Em seguida, siga as instruções para identificar a sua placa. Se você tem um Board of Education USB (qualquer Rev) ou Serial (Rev C ou superior), vá para o circuito do Board of Education na seção abaixo. Se você tem o BASIC Stamp HomeWork Board (Rev C ou superior), vá para seção do circuito do BASIC Stamp HomeWork Board abaixo. Se você tem o BASIC Stamp HomeWork Board (Rev C ou superior) vá para a seção do circuito do BASIC Stamp HomeWork Board Servo na página 82. Se a sua placa não estiver na lista acima, vá para www.parallax.com/Go/WAM → Conexões de Circuito do Servo ( Servo Circuit Connections) para encontrar instruções de circuito para a sua placa.. Quando você fizer as instruções do circuito do servo para a sua placa, vá para Atividade # 2: Programa de Teste de Controle do Servo na página 84. Circuito do Servo no Board of Education Essas instruções são para todos USB Board of Education Revision C, bem como para o Serial Board of Education Rev C ou superior. Desligue a energia mostrada na Figura 4-3. Figura 4-3 Desconecte a energia Coloque a chave na posição 0 no conjunto de 3 posições Reset 0 1 2 A Figura 4-4 mostra o cabeçalho do servo no Board of Education. Esta placa tem um fio que você pode usar para conectar a fonte de alimentação do servo, quer Vin ou Vdd. O fio é a peça retangular preta removível indicada pela seta entre os dois cabeçalhos do servo. Verifique se o fio está definido em Vdd como mostrado na Figura 4-4. Se estiver definido Vin, levante o fio retangular para fora dos pinos em que está atualmente posicionado, e, em seguida, pressione-o nos dois pinos mais próximos do rótulo Vdd. Página - 81 Figura 4-4 Fio do cabeçalho do servo definido para Vdd 15 14 Vdd 13 12 Red Black X4 X5 Vin O fio permite que você escolha a fonte de alimentação (Vin ou Vdd) para o Servo Padrão Parallax. Se você estiver usando uma bateria de 9 V, configure-o para Vdd. Se você estiver usando uma pilha elétrica 4 AA, ou baterias de 6 V, qualquer configuração funcionará. Se você estiver usando um suporte de parede com fonte de alimentação DC, use apenas Vdd. Antes de conectar a fonte de montagem na parede DC para o Board of Education, não se esqueça de verificar as especificações aceitáveis para os suprimentos DC listados no BASIC Stamp Editor Help. A Figura 4-5 mostra o esquema do circuito que você vai construir em seu Board of Education. Construa o circuito mostrado na Figura 4-5 e na Figura 4-6. Certifique-se de que você ligou o servo da maneira correta. Os fios branco, vermelho e preto devem estar alinhados como mostrado na Figura 4-6 P14 Figura 4-5 Esquema indicador do Servo e do LED para o Board of Education 470 Ω LED Vss Vdd P14 White Red Black Vss Servo Para Serial Board of Education Rev C, ou mais recente, ou qualquer USB Board of Education Página - 82 15 14 Vdd 13 12 White Red Black Red Black X4 Vdd X3 X5 Vin Vss + Figura 4-6 Servo e LED Indicador no Board of Education P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 standard servo www.parallax.com Até agora, você tem usado o interruptor de 3 posições na posição 1. Agora, você vai movê-lo para a posição 2 para ligar a energia para o cabeçalho servo. Forneça energia para o cabeçalho de servo ajustando o interruptor de três posições, como mostrado na Figura 4-7. Seu servo pode mover-se um pouco quando você ligar a energia. Figura 4-7 Alimentação ligada ao Board of Education e cabeçalho do Servo Reset 0 1 2 Se você vir instruções neste capítulo, que se lê "Ligação de energia para o seu Board" mova o interruptor de 3 posições para a posição-2. Da mesma forma, se você vir instruções neste capítulo, que se lê "Desligue a alimentação de sua placa" mova o interruptor de 3 posições para a posição-0. Desligue a alimentação de sua placa. Vá para a Atividade #2 na página 84. Circuito do BASIC Stamp HomeWork Board Servo Se você está conectando seu servo em um BASIC Stamp HomeWork Board (Rev C ou mais recente), você vai precisar dessas peças extras do seu kit: (1) Conector de 3 pinos macho (como mostrado na Figura 4-8). (4) Fios Página - 83 Figura 4-8 Peça extra para circuito do Servo do BASIC Stamp HomeWork Board Conector de 3 pinos macho A Figura 4-9 mostra o esquema do servo e circuitos indicadores do LED no BASIC Stamp HomeWork Board. As instruções que vêm depois desta figura mostrarão como construir com segurança este circuito. Desligue a bateria 9 V do seu HomeWork Board. Construa o indicador de LED e circuito do cabeçalho do servo mostrado no esquema da Figura 4-9 e o diagrama de fiação na Figura 4-10. P14 470 Ω LED Vss Figura 4-9 Esquema de Servo e LED Indicador no HomeWork Board Vdd P14 White Red Servo Black Vss Figura 4-10 LED Indicador e circuitos do cabeçalho do Servo no HomeWork Board Ligue o servo no cabeçalho do servo, como mostrado na Figura 4-11. Certifique-se de que as cores dos fios do servo estejam alinhadas corretamente com as cores marcadas na imagem. Confira a fiação. Página - 84 ATENÇÃO Utilize apenas uma bateria de 9 V quando o seu Servo Padrão Parallax estiver ligado ao BASIC Stamp HomeWork Board. Não use qualquer tipo de alimentação DC ou "bateria substituta" que se conecta a uma tomada AC. Para melhores resultados, certifique-se que sua bateria é nova. Se você estiver usando uma bateria recarregável, verifique se ela está recém-recarregada. Também deve ser avaliada por 100 mAh (miliampere hora) ou mais. Reconecte sua bateria 9 V para seu HomeWork Board. O servo pode mexer-se um pouco quando você fizer a conexão. Figura 4-11 Servo Conectado ao HomeWork Board ATIVIDADE #2: PROGRAMA DE TESTE DE CONTROLE DO SERVO Grau é a medida de um ângulo representada pelo símbolo “ ° ”. Exemplos de medidas de grau do ângulo são mostrados na Figura 4-12, incluindo 30°, 45°, 90°, 135° e 180°. Cada ponto de medição do ângulo representa 1/360 de um círculo, assim a medida de 90° é de ¼ de um círculo, ou seja, 90 ÷ 360 = ¼. Da mesma forma, 180° é ½ de um círculo, ou seja, 180 ÷ 360 = ½, você pode calcular frações semelhantes para as outras medições de graus na figura. Figura 4-12 Exemplos de medidas de ângulo em graus O servo padrão da Parallax é capaz de manter qualquer posição dentro de uma gama de 180°, assim as medições de grau podem ser úteis para descrever as posições que o servo detém. A Figura 4-13 mostra exemplos de um servo com um laço de arame, que foi introduzido através de dois dos furos em seu horn e, em seguida, torcido. A direção que o laço de torção aponta indica o ângulo do horn do servo, veja na figura exemplos de 0°, 45°, 90°, 135° e 180°. Página - 85 Figura 4-13: Exemplos da posição do horn de um servo A amplitude de movimento e limites mecânicos do horn de seu servo provavelmente será diferente do que é mostrado aqui. As instruções sobre como ajustá-lo para corresponder a essa imagem virão após o primeiro programa de exemplo. Durante a fabricação, a montagem do horn do servo é aleatória, por isso as posições do horn do servo serão, provavelmente, diferentes das mostradas na Figura 4-13. Na realidade, em comparação com a Figura 4-13, o horn de seu servo pode ser montado em qualquer posição em uma faixa +/- 45°. O servo na Figura 4-14 mostra o exemplo de um servo cuja ponta foi montada a 20°, no sentido horário, a partir da Figura 4-13. Depois de encontrar o centro da amplitude de movimento do horn do servo, você pode usá-la como uma referência de 90° ou ajustar mecanicamente o horn do servo para que ele corresponda a Figura 4-13 seguindo instruções incluídas mais a frente nesta atividade. Figura 4-14: Exemplos de posição do horn do servo antes do ajuste mecânico Este é um exemplo de um horn que está montado no eixo de saída do servo cerca de 20° para a esquerda da forma como foi definido na Figura 4-13. Você pode encontrar o centro da amplitude de movimento do servo girando suavemente o horn para encontrar seu sentido horário e anti-horário nos limites mecânicos. A posição a meio caminho entre estes dois limites é o centro, ou a posição de 90°. A posição central do servo pode cair em qualquer lugar da área mostrada na Figura 4-15. Página - 86 O centro da amplitude de movimento do horn de seu servo deve cair em algum lugar nesta área. Figura 4-15 Gama de posições centrais possíveis Nestes próximos passos, torça o horn do servo lentamente sem forçá-lo! O servo foi construído com limites mecânicos para evitar que o horn gire fora de sua faixa de 180° de movimento. Torça o horn suavemente, e você será capaz de sentir quando ele atinge um dos seus limites mecânicos. Não tente forçá-lo além desses limites, pois assim você pode tirar as engrenagens de dentro do servo do lugar. Verifique se a energia de sua placa ainda está desconectada. Delicadamente gire o horn do servo para descobrir os seus limites mecânicos, em sentido horário e anti-horário. O horn do servo girará aplicando muita pouca força até chegar a esses limites. NÃO TENTE TORCER OS HORNS ALÉM DESTES LIMITES, torça somente o suficiente para encontrá-los. Gire o horn do servo para que ele fique a meio caminho entre os dois limites. Esta é, aproximadamente, a posição "central" do servo. Com o horn do servo em sua posição central, passe um fio através do horn, torça e amarre-o para que ele aponte para cima, na área mostrada na Figura 4-15. Tenha em mente que a direção do laço de torção mostrada na figura é apenas um exemplo; o seu laço de torção pode apontar para qualquer lugar da área. Onde quer que ele aponte quando estiver no centro de sua amplitude de movimento, deveria estar bem próximo da posição de 90° do servo. Mais uma vez, esta posição pode variar de um servo para o outro, devido a forma que o horn é conectado ao servo. Programando a Posição do Servo O gráfico na Figura 4-16 é chamado de diagrama de tempo, e mostra exemplos de sinais de alta/baixa que o BASIC Stamp tem que enviar ao servo para fazê-lo manter sua posição de 90°. Página - 87 Figura 4-16 Diagrama de tempo do sinal do Servo Pulsos de 1,5 ms fazem com que o servo mantenha a posição “central” de 90° O diagrama de tempo mostra sinais de alta que duram 1,5 ms, separados por sinais de baixa que duram 20 ms. O ... para a direita do sinal é uma maneira de indicar que os sinais de baixa de 1,5 ms e 20 ms têm de ser repetidos várias vezes para fazer o servo manter a posição. O símbolo "~" em "~ 20 ms" indica que o tempo de baixa pode ser aproximado, podendo variar de alguns milésimos de segundos acima ou abaixo de 20 ms, com quase nenhum efeito sobre as posições do horn do servo. Isso porque a quantidade de tempo que o sinal de alta dura, é que diz ao servo que posição ficar, por isso tem que ser precisa. Há um comando especial chamado PULSOUT que dá ao seu programa um controle preciso sobre as durações desses breves sinais de alta, que são comumente chamados pulsos. Aqui está a sintaxe do comando PULSOUT: PULSOUT Pin, Duration Com o comando PULSOUT, você pode escrever o código PBASIC para fazer o BASIC Stamp definir a posição do servo a 90° usando a Figura 4-16 do diagrama de tempo como um guia. O argumento Pin do comando PULSOUT tem que ser um número que diz que ao BASIC Stamp qual pino de I/O deve transmitir o pulso. O argumento Duration do comando PULSOUT é o número de dois milionésimos-de-um-segundo, que é o tempo que o pulso deve durar. 2 milionésimos de um segundo é igual a 2 microssegundos, que é abreviado 2 μs. Um milionésimo de segundo é chamado de um microssegundo. A letra grega µ é usada no lugar da palavra micro e a letra s é usado no lugar do segundo. Isso é útil para escrever e fazer anotações, pois ao invés de escrever dois microssegundos, você pode escrever 2µs. Lembrete: um milésimo de segundo é chamado de milésimo de segundo e é abreviado ms. Fato: 1 ms = 1000 µs. Em outras palavras, pode caber 1/1000000000 de um segundo em um milésimo de segundo. Agora que sabemos como usar o comando PULSOUT, o ServoCenter.bs2 envia pulsos de controle repetidamente para fazer o servo manter sua posição de 90°. O comando PULSOUT 14, 750 irá enviar um pulso de 1,5 ms para o servo. Isso porque o argumento Duration do comando PULSOUT especifica o número de 2 μs que o pulso deve durar. Desde que o argumento Duration seja 750, o comando PULSOUT fará o último pulso para 750 × 2 μs = 1.500 μs, que é de 1,5 ms uma vez que existem 1.000 μs em 1 ms. Após o pulso de alta ter sido feito, o comando PULSOUT deixa o pino de I/O enviar um sinal de baixa. Assim, um comando PAUSE 20 depois do PULSOUT faz com Página - 88 que o BASIC Stamp envie um sinal de baixa para 20 ms. Com esses dois comandos dentro de um DO...LOOP, o 1,5 ms de alta seguido por 20 ms de baixa será repetido várias vezes para fazer o servo esperar a sua posição. Exemplo de Programa: ServoCenter.bs2 ' O que é um Microcontrolador - ServoCenter.bs2 ' Mantém o servo na posição central. ' {$STAMP BS2} ' {$PBASIC 2.5} DEBUG "Programa Funcionando!", CR DO PULSOUT 14, 750 PAUSE 20 LOOP Teste o Servo na Posição “Central” de 90° A posição do servo a 90° é chamada de posição central, porque o ponto 90° está no "centro" da amplitude do movimento de 180° do servo. Os pulsos de 1,5 ms fazem o servo manter seu horn nesta posição central, que deve ser no meio do caminho determinado para encontrar os limites mecânicos do servo. Você pode usar qualquer posição central do servo para manter a referência de 90°, ou usar uma chave de fenda para remover e reposicionar o horn, assim 90° faz com que o fio do ponto do laço de torção aponte para cima. As instruções para isso virão na seção intitulada: Opcional – Ajuste dos horns do servo para 90° no Centro. Se você usar a posição central como referência, sem ajustá-la, qualquer outra posição que o servo mantiver será próxima a 90°. Por exemplo, a posição de 45° será de 1/8 de volta no sentido horário, e a posição 135° será de 1/8 de volta para a esquerda. Exemplos disto foram mostrados na Figura 414 na página 86. Vamos primeiro verificar qual posição central real de seu servo: Gire cuidadosamente o horn do servo para um de seus limites mecânicos. Reconecte a energia de sua placa. Se você tem o Board of Education, certifique- se de deslizar as 3 posições até o fim para a direita (para posição-2). Execute o ServoCenter.bs2. Assim que o programa for carregado, o horn do servo deve girar para a posição central e ficar assim. O servo "ficará" nesta posição, porque os servos padrão são projetados para resistir às forças externas que o empurram contra ele. É assim que o servo mantém a direção RC do carro, do leme do barco, ou da aba de controle do avião no local. Tome nota da posição do centro de seu servo. Aplique uma pressão suave na torção do horn como você fez ao girar o servo para encontrar os seus limites mecânicos. O servo deve resistir e segurar seu horn na posição central. Página - 89 Se você desligar a alimentação, você pode girar o servo fora da posição central. Quando você reconectar energia, o programa vai reiniciar e o servo vai mover imediatamente o horn de volta à sua posição central e mantê-lo lá. Tente isso! Opcional – Ajuste o Horn do Servo para 90° Central Opcionalmente, é possível ajustar o horn de seu servo para que ele faça o fio do laço de torção apontar para cima quando ServoCenter.bs2 estiver em execução, como mostrado no lado direito da Figura 4-17. Se você fizer este ajuste mecânico, vai simplificar o rastreamento dos ângulos do servo, pois cada ângulo será semelhante aos da Figura 4-13 na página 86. Você vai precisar de uma chave Phillips número 2 para esse ajuste opcional. Eixo de saída Chave de fenda Phillips Figura 4-17 Centralização Mecânica do Servo Você pode remover e reposicionar o horn do servo no eixo de saída com uma pequena chave de fenda horn Desligue a alimentação de sua placa. Retire o parafuso que prende o horn do servo ao seu eixo de saída e, em seguida, puxe delicadamente o horn para fora da cápsula para libertá-la. Suas peças devem assemelhar-se a que está no lado esquerdo da Figura 4-17. Reconecte a energia de sua placa. O programa deve fazer o servo manter o eixo de saída na posição central. Deslize o horn de volta no eixo de saída do servo para que seu laço aponte para cima, da mesma forma que é mostrada no canto direito da Figura 4-17. Compensando o Alinhamento: O alinhamento do servo pode não fica perfeito devido a forma como o horn se encaixa no eixo de saída, mas pode ser próximo. Você pode então ajustar a alça de arame para compensar este pequeno desvio e fazer o ponto do laço de torção para cima. Desligue a alimentação de sua placa. Volte a apertar o parafuso Phillips. Reconecte a alimentação para que o programa faça com que o servo mantenha sua posição central novamente. O laço de torção agora deve apontar para cima (ou quase em linha reta) indicando a posição de 90°. Página - 90 Sua Vez – Programas para o Servo Apontar Diferentes Direções A Figura 4-18 mostra alguns comandos PULSOUT que dizem ao servo que mantenha certas posições importantes, como 0°, 45°, 90°, 135° e 180°. Estes comandos PULSOUT são aproximados, e você terá que ajustar levemente os valores para obter posições angulares mais precisas. Você pode modificar o argumento Duration do comando PULSOUT para ocupar qualquer área neste intervalo. Por exemplo, se você deseja que o servo mantenha a posição de 30°, o argumento Duration do comando PULSOUT teria que ser 417, que é 2/3 do caminho entre o argumento Duration de 250 (0°) para 500 (45°). As durações de pulso na Figura 4-18 deixarão o horn do servo próximo aos ângulos indicados, mas elas não são necessariamente exatas. Você pode experimentar com diferentes valores PULSOUT Duration para um posicionamento mais preciso. Salve uma cópia do ServoCenter.bs2 como TestServoPositions.bs2 Altere o argumento PULSOUT Duration do programa de 750-para 500, e execute o programa modificado para verificar se ele faz com que o servo mantenha sua posição de 45°. Repita este teste de argumentos PULSOUT Duration com 1000 (135°), e 417 (30°). Para tentar prever o PULSOUT Duration você precisaria de uma posição que não está listada na Figura 4-18, e teste para certificar-se de que o servo gire o horn e mantenha a posição que você deseja. Exemplo de posições que podem incluir 60°, 120° etc. Mantenha os argumentos PULSOUT Duration de seu programa na faixa 350 para 1150. A faixa é "em teoria", de 250-1250, mas na prática, o servo pode tentar ir além dos seus limites mecânicos. Isto pode reduzir a vida útil do servo. Se você quiser maximizar o alcance de movimento de seu servo, cuidadosamente teste os valores que ficam gradualmente mais perto dos limites mecânicos. Enquanto você usar os valores PULSOUT Duration que posicionam o horn do servo apenas para dentro de seus limites mecânicos, o desgaste será normal em vez de excessivo. Página - 91 Figura 4-18: Posições do horn do servo, comandos PULSOUT durações de pulso em ms. Faça o Cálculo Junto com cada comando PULSOUT na Figura 4-18, há um número correspondente a milésimos de segundos que cada pulso dura. Por exemplo, o pulso que o comando PULSOUT 14, 417 envia dura 0,834 ms, e o pulso que o PULSOUT 14, 500 envia dura 1,0 ms. Se você tem um BASIC Stamp 2 e quer converter o tempo de milésimos de segundos para o argumento Duration para o seu comando PULSOUT, use essa equação: Duration = number of ms × 500 Por exemplo, se você já não soubesse que o argumento Duration do comando PULSOUT para 1,5 ms é 750, aqui está como você pode calcular isso: Duration = 1 .5 × 500 = 750 A razão pela qual nós devemos multiplicar o número de milésimos de segundos em um pulso por 500 para obter um argumento Duration do comando PULSOUT é porque Duration é em termos de unidades de 2 μs para o BS2. Quantas unidades de 2 μs têm em 1 ms? Para descobrir, basta dividir 2 sobre um milionésimo por 1 sobre 1 milésimo. 1 2 ÷ = 500 1,000 1,000,000 Se o seu comando for PULSOUT 14, 500, o pulso vai durar 500 × 2 = 1.000 μs = 1,0 ms. (Lembre-se, 1,000 μs = 1 ms.) Página - 92 Você também pode descobrir o enigma de um argumento Duration de um comando PULSOUT usando esta equação: number of ms = Duration ms 500 Por exemplo, se você considerar o comando PULSOUT 14, 850, quanto tempo o pulso realmente durou? 850 ms 500 = 1 .7 ms number of ms = Escreva o Código de Diagramas de Tempo A Figura 4-19 mostra um diagrama de tempo do sinal que o BASIC Stamp pode enviar a um servo para que seu horn mantenha uma posição de 135°. Uma vez que este diagrama de tempo apresenta pulsos repetidos, separados por sinais de baixa de 20ms, o DO ... LOOP do ServoCenter.bs2 fornece um bom ponto de partida, e tudo o que precisa ser ajustado é a duração do pulso de alta frequência. Para calcular o argumento Duration do comando PULSOUT para pulsos de 2 ms no diagrama de tempo, você pode usar a equação Duration na seção “Faça o cálculo” (Do the Math) Duration = number of ms × 500 = 2.0 × 500 = 1000 Quando 1000 for substituído no argumento Duration do comando PULSOUT, o loop de controle do servo deve ficar assim: DO PULSOUT 14, 1000 PAUSE 20 LOOP Teste o DO...LOOP em uma cópia do ServoCenter.bs2 e verifique se posição do horn do servo está próxima de 135°. Repita este exercício para o diagrama de tempo na Figura 4-20. Figura 4-19 Diagrama de Tempo para Posição de 135° Pulsos de 2 ms separados por 20 ms Página - 93 Figura 4-20 Diagrama de Tempo para Posição de 45° Pulsos de 1 ms separados por 20 ms ATIVIDADE #3: CONTROLE DE TEMPO DE ESPERA DO SERVO Animatrônicos utilizam a eletrônica para animar adereços e efeitos especiais, e os servos são uma ferramenta comum neste campo. A Figura 4-21 mostra o exemplo de um projeto de robótica de uma mão animatrônica, com servos controlando cada dedo. O programa PBASIC que controla os gestos das mãos tem que fazer os servos manterem a posição por um determinado período de tempo para cada gesto. Na atividade anterior, os nossos programas fizeram com que os servos sustentassem determinadas posições por tempo indeterminado. Esta atividade apresenta como escrever um código que faz com que o servo mantenha certas posições por determinados períodos de tempo. Figura 4-21 Mão Animatrônica Há cinco servos na parte inferior direita da figura que estão conectados aos dedos e que, quando acionados, fazem-os flexionar. Sendo, assim o BASIC Stamp possui controle sobre cada dedo. Loops FOR...NEXT para Controlar o Tempo que o Servo Mantém uma Posição Se você escrever um código para fazer um LED piscar uma vez por segundo, você pode inserir o código em um loop FOR...NEXT que se repete três vezes para fazer com que a luz pisque por três segundos. Se os seus LEDs piscam cinco vezes por segundo, você terá que fazer o loop FOR...NEXT repetir o circuito quinze vezes para fazer com que o LED pisque por três segundos. Uma vez que os comandos PULSOUT e PAUSE que controlam o seu servo são responsáveis por enviar sinais de alta/baixa, eles também fazem o LED piscar. Os sinais que enviamos para o servo na atividade anterior fizeram com que o brilho do LED fosse fraco, talvez com uma aparente tremulação, porque os sinais on/off são muito rápidos, e os tempos de alta muito breves. Vamos diminuir os sinais até a velocidade 1/10 para que a luz do LED indicador fique visível e piscando. Página - 94 Exemplo de Programa: SlowServoSignalForLed.bs2 Comparado com o sinal do centro do servo, este exemplo de programa aumenta as durações do PULSOUT e PAUSE por um fator de dez, para que possamos vê-los como o LED indicador pisca. O loop FOR ... NEXT do programa se repete em quase 5 vezes por segundo, de modo que 15 repetições resultam no piscar da luz por três segundos. Desconecte a energia do seu servo: o Se você tem o Board of Education, coloque o interruptor de 3 posições para posição 1 para desligar a alimentação do servo. A posição 1 continua a fornecer energia ao resto do sistema. o Se você tem o BASIC Stamp HomeWork Board, desligue temporariamente a ponta do fio que está ligada a Vdd e deixe-a livre. Isto irá desligar a alimentação do seu servo. Coloque e execute SlowServoSignalsForLed.bs2. Verifique se o LED pisca rapidamente por cerca de três segundos. Substitua o EndValue, do loop FOR...NEXT, de 15 para 30 e reexecute o programa. Como o loop é repetido de duas a infinitas vezes, a luz deve piscar pelo dobro de tempo - seis segundos. Reconecte a energia de seu servo: o Se você tem o Board of Education, coloque o interruptor de 3 posições de volta a posição 2 para reconectar o servo. o Se você tem o BASIC Stamp Homework Board, ligue a extremidade do fio que você desconectou na tomada Vdd. ' O que é um Microcontrolador – SlowServoSignalsForLed.bs2 ' Diminua para 1/10 a velocidade do sinal do servo para que seja ' possível ver o LED indicador acender e apagar. ' {$STAMP BS2} ' {$PBASIC 2.5} DEBUG "Programa funcionando!", CR counter VAR Word FOR counter = 1 to 15 PULSOUT 14, 7500 PAUSE 200 NEXT Exemplo de Programa: ThreeServoPositions.bs2 Se você alterar PULSOUT 14, 7500 para PULSOUT 14, 750 e PAUSE 200 para PAUSE 20, você terá um loop FOR...NEXT que envia rapidamente o sinal de posição central para o servo. Uma vez que os sinais agora duram 1/10 de suas durações no SlowServoSignalsForLed.bs2, todo o loop FOR...NEXT levará 1/10 de tempo para ser executado. Se o objetivo é fazer com que o servo mantenha uma determinada posição por três segundos, simplesmente envie o número de pulsos dez vezes maior, aumentando o argumento FOR...NEXT EndValue de 15 a 150. FOR counter = 1 to 150 segundos. PULSOUT 14, 750 PAUSE 20 ' Centralize por cerca de 3 Página - 95 LOOP O programa de exemplo ThreeServoPositions.bs2 faz o servo manter três posições diferentes que são mostradas na Figura 4-22, cada uma por cerca de 3 segundos. Figura 4-22 ThreeServoPositions.bs2 O programa faz com que o servo mantenha cada posição por cerca de três segundos. Coloque e execute o ThreeServoPositions.bs2. Verifique se o servo mantém cada posição na sequência mostrada na Figura 4-22 por cerca de três segundos. A última posição que o servo vai manter por 3 segundos é de 135° e, em seguida, o programa para. O horn do servo vai ficar na mesma posição, mesmo o BASIC Stamp tendo parado de enviar os pulsos de controle. A diferença é que, durante os três segundos que o BASIC Stamp mantém a posição de 135°, o servo resiste a quaisquer forças que tentam empurrar o horn para longe dessa posição. Após os 3 segundos, o horn do servo poderá manipulado manualmente. Um jeito de você dizer se o servo está recebendo sinais de controle é observar o indicador de LED que está conectado ao P14. Enquanto o LED indicador estiver aceso, significa que o servo está recebendo sinais de controle e mantendo a sua posição. Quando o sinal parar você verá o brilho no LED indicador parar também. Reexecute o programa (ou apenas pressione e solte o botão Reset de sua placa). Assim que o servo atingir a posição de 135°, fique de olho no sinal do LED indicador enquanto você aplica uma leve força de torção no horn. Você deve ser capaz de sentir a resistência do servo enquanto o LED acende de modo muito fraco indicando que o servo ainda está recebendo um sinal de controle. Assim que o LED desligar, indicando que o sinal de controle está parado, o servo irá parar de manter a sua posição, e você será capaz de girar o horn manualmente. Quando o sinal de 135° parar, verifique se o LED indica que o sinal foi interrompido e se o servo permite que você torça o horn além da posição 135°. ' O que é um Microcontrolador – ThreeServoPositions.bs2 ' Servo mantém as posições de 45, 90, e 135 graus por cerca de 3 ' segundos cada. ' {$STAMP BS2} ' {$PBASIC 2.5} counter VAR Word PAUSE 1000 DEBUG "Posição = 45 graus...", CR Página - 96 FOR counter = 1 TO 150 PULSOUT 14, 500 PAUSE 20 NEXT ' 45 graus por cerca de 3 seg. DEBUG "Posição = 90 graus...", CR FOR counter = 1 TO 150 PULSOUT 14, 750 PAUSE 20 NEXT ' 90 graus por cerca de 3 seg. DEBUG "Posição = 135 graus...", CR FOR counter = 1 TO 150 PULSOUT 14, 1000 PAUSE 20 NEXT ' 135 graus por cerca de 3 seg. DEBUG "Pronto.", CR, CR END Sua Vez – Ajustando a Posição vs. Ajustando o Tempo de Espera ThreeServoPositions.bs2 assume que executar 50 pulsos do servo em um loop FOR...NEXT leva cerca de 1 segundo. Você também pode usar isso para ajustar o tempo de espera, ajustando o argumento do EndValue do loop FOR...NEXT. Por exemplo, se você deseja que o servo mantenha sua posição por cerca de dois segundos, altere o argumento EndValue de 150 para 100. Para cinco segundos, altere de 150 para 250, e assim por diante. Salve uma cópia do ThreeServoPositions.bs2. Modifique cada argumento do EndValue do loop FOR...NEXT e experimente diferentes valores para diferentes tempos de espera. Opcional: Personalize as posições de espera, ajustando argumento Duration de cada comando PULSOUT. Repetição de Tempo do Loop FOR...NEXT – Realmente é 1/44 de Segundo, não 1/50 1/50 de um segundo é uma aproximação grosseira de repetição do loop. 1/44 de um segundo é uma aproximação mais aproximada. Considere a quantidade de tempo que cada elemento do loop FOR...NEXT leva para ser executado. O comando PULSOUT 14, 750 está no meio da faixa de possíveis durações de pulso, para que ele possa ser o ponto de referência para a duração média de pulso. Ele envia um pulso que dura 750 × 2 ms = 1.500 ms = 1,5 ms. O comando PAUSE 20 faz o programa atrasar 20 ms. O loop FOR...NEXT com comandos PULSOUT e PAUSE leva cerca de 1.3 ms para processar todos os números e comandos. Embora isso signifique que o sinal de baixa entre os pulsos dura 21,3 ms em vez de 20 ms, não afeta o desempenho do servo. Os tempos de baixa podem ser alguns ms off, é apenas as durações de pulso de alta que tem que ser precisas, e o comando PULSOUT é muito preciso. Página - 97 Assim, o tempo total que o loop FOR ... NEXT leva para repetir é de 1,5 ms + 20 ms + 1.3 ms = 22,8 ms, que é 22,8 milésimos de segundo. Então, quantos 22,8 milésimos de segundo se encaixam em um segundo? Vamos dividir 0,0228 por 1 e descobrir: 1 second ÷ 0.0228 seconds/repetition ≈ 43.86 repetition s ≈ 44 repetition s É por isso que o loop é repetido a uma média de cerca de 44 repetições por segundo. O número de repetições em um segundo é chamado de hertz, abreviado Hz. Assim, podemos dizer que as repetições ou ciclos de sinal do servo serão de aproximadamente 44 Hz. Ciclos e hertz (Hz): Quando um sinal se repete por um determinado número de vezes, cada repetição é chamada de ciclo. O número de ciclos de um segundo é medido em hertz. Hertz é abreviado Hz. Maiores ou menores valores do PULSOUT Duration levam o loop FOR...NEXT a se repetir em pouco mais ou menos tempo. O PULSOUT Duration de 750 está bem no meio da faixa das durações de controle de pulso do servo, mostrada novamente na Figura 418 na página 92. Você pode utilizar 44 Hz como uma referência para o número de pulsos por segundo no seu código. Se você precisar ser mais preciso, basta repetir o cálculo para o comando PULSOUT que você está usando. Por exemplo, se o loop tem um comando PULSOUT com Duration de 1000 em vez de 750, levará 2 ms para o pulso, em vez de 1,5 ms. O loop ainda tem uma pausa de 20 ms e de 1,3 ms de tempo de processamento. Então, acrescenta-se 2 + 20 + 1,3 ms = 23,3 ms. Divida 1 segundo por esse valor para descobrir a taxa do loop FOR...NEXT, e teremos 1 ÷ 0,0233 ≈ 42,9 ≈ 43 Hz. Sumário de Controle do Loop FOR...NEXT do Servo A Figura 4-23 mostra a parte que cada número em um loop FOR...NEXT desempenha no controle do servo. O EndValue do loop FOR...NEXT determina o número de 1/44 de um segundo para o servo manter a posição. O argumento Duration do comando PULSOUT diz ao servo que posição manter. O valor de 750 envia um pulso de 1,5 ms, que instrui o servo a deter uma posição de 90° segundo a Figura 4-18 na página 108. O argumento Pin do comando PULSOUT escolhe o pino de I/O para o envio de sinais de controle do servo. Assim, 14 faz com que o comando PULSOUT envie breve sinal de alta (pulso) para o servo ligado ao pino de I/O P14. Quando o pulso termina, leva o pino de I/O a enviar um sinal de baixa. Em seguida, o comando PAUSE 20 assegura que o sinal de baixa dure aproximadamente 20 ms antes do pulso seguinte. Página - 98 “Pino de I/O do Servo” “Número de 44ths de um segundo para manter a posição” FOR counter = 1 TO 132 “Posição a manter” PULSOUT 14, 750 PAUSE 20 NEXT “Necessário 20 ms Figura 4-23 Loop FOR ...NEXT para Controle do Servo entre cada pulso” Na média, um loop FOR...NEXT, envia um único comando PULSOUT ao servo, seguido de PAUSE 20, que repete cerca de 44 vezes por segundo. Uma vez que este ciclo se repete 132 vezes, faz com que o servo mantenha a posição 90° por cerca de 3 segundos. Isso por que: 132 repetition s ÷ 44 repetition s/second = 3 seconds Se a sua aplicação ou projeto precisa fazer o BASIC Stamp enviar ao servo um sinal por um determinado número de segundos, basta multiplicar o número de segundos por 44, e usar o resultado em seu argumento EndValue do loop FOR...NEXT. Por exemplo, se o sinal deve durar cinco segundos: 5 seconds × 44 repetitions/second = 220 repetitions ATIVIDADE #4: CONTROLANDO POSIÇÕES COM SEU COMPUTADOR A automação industrial envolve, muitas vezes, microcontroladores que se comunicam com computadores de maior porte. Os microcontroladores leem sensores e transmitem os dados para o computador principal. O computador principal interpreta e analisa os dados do sensor e envia informações de volta sobre a posição para o microcontrolador. O microcontrolador pode, em seguida, atualizar a velocidade da correia de transporte, classificar uma posição, ou alguma outra tarefa mecânica de controle do motor. Você pode usar o DEBUG Terminal para enviar mensagens a partir do seu computador para o BASIC Stamp, como mostrado na Figura 4-24. O BASIC Stamp tem que ser programado para ouvir as mensagens que você enviar, usando DEBUG Terminal, e também para armazenar os dados que você enviar em uma ou mais variáveis. Página - 99 Figura 4-24 Enviando mensagens para o BASIC Stamp Clique no campo branco acima do painel de exibição da mensagem e digite sua mensagem. Uma cópia da mensagem que você digitou aparece na janela inferior. Essa cópia é chamada de eco. Nesta atividade, você vai programar o BASIC Stamp para receber dois valores a partir do DEBUG Terminal e, em seguida, usar esses valores para controlar o servo: 1. Número de pulsos para enviar ao servo 2. Valor do argumento Duration usado pelo comando PULSOUT Você também vai programar o BASIC Stamp para usar esses valores para controlar o servo. Peças e Circuito As mesmas da Atividade #2 Programando o BASIC Stamp para Receber Mensagens do DEBUG A programação do BASIC Stamp para envio de mensagens para o DEBUG Terminal é feita usando o comando DEBUG. A programação do BASIC Stamp para receber mensagens do DEBUG Terminal é feita usando o comando DEBUGIN. Ao utilizar o DEBUGIN, você também terá que declarar uma ou mais variáveis para o BASIC Stamp armazenar as informações que recebe. Aqui está um exemplo de uma variável que você pode declarar para que o BASIC Stamp armazene um valor: pulses VAR Word Posteriormente no programa, você poderá usar essa variável para armazenar um número recebido pelo comando DEBUGIN: DEBUGIN DEC pulses Quando o BASIC Stamp recebe um valor numérico a partir do DEBUG Terminal, ele armazena-o em uma variável de pulsos. O formatador DEC diz ao comando DEBUGIN que os caracteres que estão sendo enviados são algarismos que formam um número Página - 100 decimal. Assim que você pressionar a tecla Enter, o BASIC Stamp armazenará os dígitos recebidos, na variável de pulsos, como um número decimal, e, em seguida, avançará. Embora não esteja incluído no programa de exemplo, você pode adicionar uma linha para verificar se a mensagem foi processada pelo BASIC Stamp. DEBUG CR, "Você enviou o valor: ", DEC pulses Exemplo de Programa: ServoControlWithDebug.bs2 Figura 4-25 mostra as janelas de transmissão do DEBUG Terminal juntamente com a sua janela de recebimento. Janelas de recebimento é o que nós temos usado ao longo de todo o processo para exibir mensagens que o DEBUG Terminal “recebe” do BASIC Stamp. A janela de transmissão permite que você digite em caracteres e números e “envie-os” ao BASIC Stamp. Figura 4-25 Janela do DEBUG Terminal ← Janela de Transmissão ← Janela de Recebimento Na figura 4-25, o número 264 é digitado na janela de transmissão do DEBUG Terminal. Abaixo, na janela de recebimento, uma cópia do valor 264 é mostrada ao lado da mensagem "Enter run time...". Essa cópia é chamada de eco, e isso só é exibido na janela se o eco (Echo Off) no campo de seleção estiver desmarcado. Eco é quando você envia uma mensagem através da janela de transmissão do DEBUG Terminal, e uma cópia dessa mensagem aparece na janela de recebimento do DEBUG Terminal. Há uma caixa de seleção Echo Off no canto inferior direito do DEBUG Terminal e você pode clicar nela para alternar a seleção. Para esta atividade, queremos mostrar os ecos na janela de recebimento, portanto, deixe a caixa de seleção Echo Off desmarcada. Coloque o ServoControlWithDebug.bs2 no BASIC Stamp Editor e execute-o. Se a janela de transmissão é muito pequena, redimensione-a usando o mouse para clicar, segurar e arrastar o separador para baixo. O separador é mostrado, acima da mensagem de texto “Introduza o tempo de execução como um” (“Enter run time as a”), na Figura 4-25. Verifique se a caixa de seleção Echo Off no canto inferior direito está desmarcada. Clique na área superior da janela de transmissão para colocar o cursor lá e digite as mensagens. Página - 101 Quando o DEBUG Terminal pedir “Introduza o tempo de execução de uma série de pulsos:” digite o número 132, e pressione no teclado de seu computador a tecla Enter. Quando o DEBUG Terminal pedir “Coloque a posição como duração de PULSOUT:” digite o número 1000 e, em seguida, aperte Enter. O PULSOUT Duration deve ser um número entre 350 e 1150. Se você digitar números fora desta faixa, o programa irá mudar para o número mais próximo dentro desse intervalo, ou 350 ou 1150. Se o programa não tem esse recurso de segurança, alguns números poderão ser inscritos que fariam o servo tentar girar para uma posição além de seus próprios limites mecânicos. Embora não quebre o servo, poderá encurtar a vida útil do dispositivo. O BASIC Stamp vai exibir a mensagem “Servo em execução...” enquanto estiver enviando pulsos para o servo. Quando terminar o envio de pulsos para o servo, ele exibirá por um segundo a mensagem “Pronto”. Em seguida, pedirá que você introduza novamente o número de pulsos. Divirta-se com ele, mas certifique-se de seguir as instruções da caixa de avisos sobre permanecer entre 350 e 1150 para o seu valor PULSOUT. Experimente entrar com outros valores entre 350 e 1150 para o PULSOUT Duration e 1 e 65534 para o número de pulsos. Fazer o servo manter uma posição durante 1 segundo demora cerca de 44 pulsos. Então, para fazer o servo manter uma posição por cerca de 5 minutos, você poderá introduzir 13200 “número exato de pulsos”. Isso é 44 pulsos/segundo × 60 segundos/minutos × 5 minutos = 13200 pulsos. Por que usar valores de 1 a 64434? Se você realmente estiver interessado, leia toda a seção sobre o comando FOR...NEXT no manual do BASIC Stamp para aprender sobre o erro 16-bit rollover ou amplitude da variável. Ela pode causar um bug quando você estiver fazendo seus próprios programas! ' O que é um Microcontrolador - ServoControlWithDebug.bs2 ' Envia mensagens para o BASIC Stamp para controlar o servo usando ' o Debug Terminal. ' {$STAMP BS2} ' {$PBASIC 2.5} counter pulses duration VAR VAR VAR Word Word Word PAUSE 1000 DEBUG CLS, "Tempo de execução do servo:", CR, " ~44 pulsos em 1 segundo", CR, "Posição do servo:", CR, " 350 <= PULSOUT Duration <= 1150", CR, CR DO DEBUG "Informe o tempo de execução ", CR, "como número de pulsos: " Página - 102 DEBUGIN DEC pulses DEBUG "Informe a posição como", CR, "PULSOUT Duration: " DEBUGIN DEC duration duration = duration MIN 350 MAX 1150 DEBUG "Serva em execução...", CR FOR counter = 1 TO pulses PULSOUT 14, duration PAUSE 20 NEXT DEBUG "Pronto", CR, CR PAUSE 1000 LOOP Como Funciona o ServoControlWithDebug.bs2 Três variáveis de WORD são declaradas neste programa: counter pulses duration Var Var Var WORD WORD WORD A variável counter é declarada para uso por um loop FOR...NEXT. (Veja o Capítulo 2, Atividade #3 para mais detalhes.) Os pulsos e variáveis de duração são usados de duas maneiras diferentes. Ambos são usados para receber e armazenar os valores enviados a partir do DEBUG Terminal. A variável pulses também é usada para definir o número de repetições no loop FOR...NEXT, que envia pulsos para o servo, e a variável Duration é usada para definir a duração de cada pulso do comando PULSOUT. Um comando DEBUG fornece um lembrete de que há cerca de 44 pulsos em um segundo no loop FOR...NEXT, e que o argumento PULSOUT Duration que controla a posição do servo pode ser um valor entre 350 e 1150. DEBUG CLS, "Tempo de execução do servo:", CR, " ~44 pulsos em 1 segundo ", CR, "Posição do servo:", CR, " 350 <= PULSOUT Duration <= 1150", CR, CR O resto do programa é inserido dentro de um DO...LOOP sem um argumento WHILE ou UNTIL Condition, para que os comandos executem uma e outra vez. DO ' Resto do programa não exibido. LOOP O comando DEBUG é usado para enviar uma mensagem para você (o "usuário" do software) digitar o número de pulsos. Em seguida, o comando DEBUGIN espera por você para inserir dígitos que compõem o número e pressionar a tecla Enter no teclado. Os dígitos inseridos são convertidos para um valor que é armazenado na variável de pulsos. Página - 103 Este processo é repetido com um segundo comando DEBUG e DEBUGIN que carregam um outro valor digitado na variável de duração também. DEBUG "Informe o tempo de execução ", CR, "como número de pulsos: ” DEBUGIN DEC pulses DEBUG "Informe a posição como", CR, "PULSOUT Duration: " DEBUGIN DEC duration Depois de inserir o segundo valor, é útil exibir uma mensagem enquanto o servo estiver funcionando para que você não tente entrar com um segundo valor durante esse tempo: DEBUG "Servo em execução...", CR Enquanto o servo está em execução, você pode tentar mover delicadamente o horn do servo longe da posição que está segurando. O servo resistirá a uma leve pressão aplicada no horn. FOR Counter = StartValue TO EndValue {STEP StepValue} ... NEXT Esta é a sintaxe do loop FOR ... NEXT do manual do BASIC Stamp. Isso mostra que você precisa de um Counter, StartValue e EndValue para controlar quantas vezes o loop se repete. Há também um StepValue opcional, se você quiser adicionar um número diferente de 1 ao valor do Counter cada vez através do loop. Como nos exemplos anteriores, a variável Counter foi usada para manter o controle das repetições do loop FOR...NEXT. A variável Counter à parte, neste loop FOR...NEXT, introduz algumas novas técnicas para o uso de variáveis para definir como o programa (e o servo) se comportam. Até este exemplo, os loops FOR...NEXT usaram constantes como 10 ou 132 nos loops do argumento EndValue. Neste loop FOR...NEXT, o valor da variável de pulsos é utilizado para controlar o loop FOR...NEXT EndValue. Assim, você define o valor de pulsos, inserindo um número no DEBUG Terminal e controla o número de repetições que o loop FOR...NEXT faz, que por sua vez controla o tempo que o servo mantém uma determinada posição. FOR counter = 1 to pulses PULSOUT 14, duration PAUSE 20 NEXT Além disso, nos exemplos anteriores, os valores constantes, tais como 500, 750 e 1000 foram utilizados para o argumento Duration do comando PULSOUT. Neste loop, a variável denominada Duration que você definiu ao inserir os valores na janela de transmissão do DEBUG Terminal, definirão agora a duração do pulso do comando PULSOUT, que por sua vez controlará a posição que o servo irá manter. Página - 104 Tire algum tempo para ServoControlWithDebug.bs2. entender o loop FOR...NEXT no É um dos primeiros exemplos das coisas incríveis que você pode fazer com as variáveis em argumentos e loops do comando PBASIC, e também destaca a utilidade que um módulo de microcontrolador programável, como o BASIC Stamp, pode ter. Sua Vez – Estabelecendo Limites no Software Vamos imaginar que este sistema de controle de servo pelo computador é aquele que tem sido desenvolvido para controle remoto. Talvez um guarda de segurança use isso para abrir uma porta que ele vê por uma câmera remota. Talvez um estudante universitário use para controlar as portas de um labirinto que os ratos percorrem em busca de comida. Talvez um militar use para apontar um canhão para um determinado alvo. Se você está projetando um produto para outra pessoa usar, a última coisa que você quer é dar ao usuário (guarda de segurança, estudante universitário, militar) a capacidade de inserir um número errado que poderia danificar o equipamento. Durante a execução do ServoControlWithDebug.bs2, é possível cometer um erro ao digitar o valor Duration no DEBUG Terminal. Vamos dizer que você acidentalmente digitou 100 em vez de 1000 ao pressionar Enter. O valor de 100 fará com que o servo tente voltar para uma posição além de seus limites mecânicos. Embora ele não vá quebrar instantaneamente o servo, com certeza não será bom para o servo ou para a sua vida útil. Assim, o programa tem uma linha que impede que esse erro cause qualquer dano: duration = duration MIN 350 MAX 1150 Este comando corrige o acidente alterando a variável Duration de 100 para 350. Da mesma forma, se você acidentalmente digitou 10000, reduziria a duração variável de 1150. Você poderia fazer algo equivalente com um par de declarações IF ... THEN: IF duration < 350 THEN duration = 350 IF duration > 1150 THEN duration = 1150 Existem algumas máquinas onde até mesmo o valor corrigido automaticamente para o mais próximo pode ter resultados indesejáveis. Por exemplo, se você tem um computador que controla uma máquina que corta algum tipo de material caro, você não deseja que a máquina simplesmente assuma que você quis dizer 350 quando tentou digitar 1000, mas acidentalmente digitou 100. Se o material era para ser cortado apenas na configuração 350, poderia vir a ser um erro caro. Outra abordagem que o programa pode ter é a de simplesmente dizer-lhe que seu valor estava fora de alcance, e que você deve tentar novamente. Aqui está um exemplo de como você pode modificar o código para fazer isso: Salve o programa de exemplo ServoControlWithDebug.bs2 sob o novo nome ServoControlWithDebugYourTurn.bs2. Substitua estes dois comandos: DEBUG "Informe a posição como ", CR, "PULSOUT Duration: " Página - 105 DEBUGIN DEC duration … Com este bloco de código: DO DEBUG "Informe a posição "PULSOUT Duration: DEBUGIN DEC duration IF duration < 350 THEN DEBUG "O valor precisa PAUSE 1000 ENDIF IF duração > 1150 THEN DEBUG "O valor precisa PAUSE 1000 ENDIF LOOP UNTIL duration >= 350 como um", CR, " ser maior do que 350", CR ser maior do que 1150", CR AND duration <= 1150 Salve o programa. Execute o programa e verifique se ele repete até que você digite o valor, na faixa correta, de 350 a 1150. ATIVIDADE #5: CONVERTENDO POSIÇÃO DE MOVIMENTO Nesta atividade, você vai programar o servo para alterar a posição em taxas diferentes. Mudando a posição em taxas diferentes, você fará com que o horn de seu servo gire em velocidades diferentes. Você pode usar esta técnica para controlar o movimento do servo ao invés de sua posição. Programando uma Taxa de Variação para Posição Você pode usar um loop FOR...NEXT para fazer o servo ter uma área de alcance de movimento da seguinte maneira: FOR counter = 500 TO 1000 PULSOUT 14, counter PAUSE 20 NEXT O loop FOR...NEXT faz com que o horn do servo comece em torno de 45° e em seguida, gire lentamente para a esquerda até chegar a 135°. Como counter é o indicador do loop FOR...NEXT, ele soma um a cada vez que é executado. O valor do counter também é usado no argumento Duration do comando PULSOUT, o que significa que a duração de cada pulso fica um pouco maior a cada vez que realiza um loop. Uma vez que há mudanças na variável counter, o mesmo acontece com a posição do horn do servo. Loops FOR...NEXT têm um argumento STEP StepValue opcional. O argumento StepValue pode ser usado para o servo fazer uma rotação mais rápida. Por exemplo, você pode usar o argumento StepValue para adicionar 8 ao counter cada vez que realizar um loop (em vez de um), modificando a instrução FOR assim: Página - 106 FOR counter = 500 TO 1000 STEP 8 Você também pode fazer o servo girar na direção oposta, fazendo uma contagem regressiva em vez de progressiva. Em PBASIC, o próximo loop FOR...NEXT vai fazer uma contagem regressiva se o argumento StartValue for maior do que o argumento EndValue. Aqui está um exemplo de como fazer uma contagem do loop FOR ... NEXT de 1000 até 500: FOR counter = 1000 TO 500 Você pode combinar a contagem regressiva com um argumento StepValue para fazer com que o servo gire mais rápido no sentido horário assim: FOR counter = 1000 TO 500 STEP 20 O truque para que o servo gire em velocidades diferentes é usar o loop FOR...NEXT para contagens progressivas e regressivas com diferentes tamanhos de passos. O exemplo de programa seguinte usa estas técnicas para fazer o horn do servo girar para trás e para frente em velocidades diferentes. Exemplo de Programa: ServoVelocities.bs2 Coloque e execute ServoVelocities.bs2. Conforme o programa é executado, observe como o valor de counter varia no DEBUG Terminal. Além disso, observe como o servo se comporta de forma diferente através dos dois loops FOR...NEXT. Tanto a direção do horn do servo como a velocidade mudam. ' O que é um Microcontrolador - ServoVelocities.bs2 ' Rotaciona o servo no sentido anti-horário devagar, e então, no ' sentido horário rápido. ' {$STAMP BS2} ' {$PBASIC 2.5} counter VAR Word PAUSE 1000 DO DEBUG "Incremento da largura de pulso em 8", CR FOR counter = 500 TO 1000 STEP 8 PULSOUT 14, counter PAUSE 7 DEBUG DEC5 counter, CR, CRSRUP NEXT DEBUG CR, "Decremento da largura de pulso em 20", CR FOR counter = 1000 TO 500 STEP 20 PULSOUT 14, counter PAUSE 7 DEBUG DEC5 counter, CR, CRSRUP NEXT Página - 107 DEBUG CR, "Repete", CR LOOP Como Funciona o ServoVelocities.bs2 O primeiro loop FOR...NEXT conta progressivamente de 500 a 1000 em passos de 8. Como a variável counter é usada como o argumento Duration do comando PULSOUT, a posição do horn do servo gira no sentido anti-horário em passos que são oito vezes o menor possível. FOR counter = 500 TO 1000 STEP 8 PULSOUT 14, counter PAUSE 7 DEBUG DEC5 counter, CR, CRSRUP NEXT Por que PAUSE 7 em vez de PAUSE 20? O comando DEBUG DEC5 counter, CR, CRSRUP leva cerca de 8 ms para ser executado. Isto significa que PAUSE 12 manteria um atraso de 20 ms entre os pulsos. Alguns experimento de tentativa e erro mostraram que PAUSE 7 dá ao servo os movimentos mais suaves. Uma vez que o tempo de baixa de 20 ms não precisa ser preciso, não há problema em ajustá-lo. Mais formatos DEBUG e controle de caracteres estão disponíveis no comando DEBUG que exibe o valor da variável counter. Este valor é impresso no formato decimal com 5 dígitos (DEC5). Depois que o valor é exibido, existe um retorno (CR). Depois disso, o caractere de controle CRSRUP (cursor para cima) envia o cursor de volta para cima na linha anterior. Isso faz com que o novo valor do counter seja sobreposto ao antigo a cada vez em que um loop é realizado. O segundo loop FOR...NEXT realiza uma contagem regressiva a partir de 1000 até 500 em passos de 20. A variável counter também é usada como um argumento para o comando PULSOUT neste exemplo, fazendo o horn do servo girar no sentido horário. FOR counter = 1000 TO 500 STEP 20 PULSOUT 14, counter PAUSE 7 DEBUG DEC5 counter, CR, CRSRUP NEXT Sua Vez – Ajuste de Velocidade Tente diferentes valores de STEP para fazer o servo girar com diferentes velocidades. Execute novamente o programa após cada modificação. Observe o efeito a cada novo valor de StepValue no que diz respeito a quão rápido o horn do servo gira. Experimente diferentes valores Duration no comando PAUSE (entre 3 e 12) para encontrar o valor que dá ao servo movimentos mais suaves para cada novo valor StepValue. Página - 108 ATIVIDADE #6: SERVO CONTROLADO POR BOTÃO Neste capítulo, você escreveu programas que fazem o servo realizar um conjunto de movimentos pré-definidos e controlou o servo usando o DEBUG Terminal. Você também pode programar o BASIC Stamp para controlar o servo baseando-se nos dados de entrada de botões. Nesta atividade, você vai: • • Construir um circuito para controlar o servo através de botões. Programar o BASIC Stamp para controlar o servo com base nas informações de entradas dos botões. Quando já tiver terminado, você será capaz de pressionar e segurar um botão para fazer o BASIC Stamp girar o servo em uma direção, e pressionar e segurar outro botão para que o servo gire em outra direção. Quando nenhum botão for pressionado, o servo irá manter sua posição. Peças Extras para o Controle por Botão do Servo Serão usadas as mesmas peças das atividades anteriores deste capítulo. Além dessas, você terá que reunir as seguintes peças para os circuitos de botões: (2) Botões – normalmente abertos (2) Resistores – 10 kΩ (marrom-preto-laranja) (2) Resistores – 220 Ω (vermelho-vermelho-marrom) (3) Fios Adicionando o Controle de Controle por Botão A Figura 4-26 mostra os circuitos de botão que você usará para controlar o servo. Adicione este circuito ao circuito do servo + LED que você vem usando até agora. Quando você terminar, o seu circuito deve se parecer: o Com a Figura 4-27 se você estiver usando o Board of Education USB (qualquer Rev) ou Serial (Rev C ou mais recente). o Figura 4-28 se você estiver usando BASIC Stamp HomeWork Board (Rev C ou mais recente). Se a sua placa não estiver listada acima, vá para www.parallax.com/go/WAM e consulte Servo Circuit Connections (Conexões do Circuito de Servo) para encontrar instruções para a sua placa de circuito. Vdd P4 220 Ω P3 220 Ω 10 kΩ Vss 10 kΩ Vss Vdd Figura 4-26 Circuitos de Botão para Controle do Servo Página - 109 Figura 4-27 Circuito do servo do Board of Education Servo com circuito de botão adicionado 15 14 Vdd 13 12 White Red Black Red Black X4 Vdd X3 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 X5 Vin Vss + standard servo www.parallax.com Para a série Board of Education Rev C ou superior, ou USB de qualquer revisão Figura 4-28 Circuito do servo do HomeWork Board Servo com circuito de botão adicionado Para o HomeWork Board Rev C ou superior Teste o botão ligado ao P3 usando a versão original do ReadPushbuttonState.bs2. A seção que tem este programa e as instruções de como usá-lo começa na página 57. Modifique o programa para que ele leia P4. Execute o programa modificado para testar o botão ligado a P4. Programando o Controle por Botão do Servo Os blocos de código IF...THEN podem ser usados para verificar se a situação do botão adiciona ou subtrai uma variável denominada Duration. Esta variável é usada no argumento Duration do comando PULSOUT. Se um dos botões é pressionado, o valor de duration aumenta. Se o outro botão é pressionado, o valor de duration diminui. Uma declaração IF...THEN é usada para decidir se a variável duration é muito grande (maior que 1000) ou muito pequena (menor que 500). Página - 110 Exemplo de Programa: ServoControlWithPushbuttons.bs2 Este exemplo de programa faz o horn do servo girar no sentido anti-horário quando o botão ligado em P4 for pressionado. O horn do servo vai manter a rotação enquanto o botão estiver pressionado e o valor de tempo será menor do que 1000. Quando o botão de pressão ligado a P3 for pressionado, o horn do servo vai girar no sentido horário. O servo também é limitado em seu movimento no sentido horário, porque a variável de tempo não é permitida ficar abaixo de 500. O DEBUG Terminal exibe o valor de duration, enquanto o programa está sendo executado. Coloque e execute o programa ServoControlWithPushbuttons.bs2 no BASIC Stamp Editor. Verifique se o servo gira no sentido anti-horário quando você pressiona e segura o botão ligado a P4. Verifique se, assim que atingido, o limite de duration > 1000, o servo para de girar no sentido anti-horário. Verifique se o servo gira no sentido horário quando você pressiona e segura o botão ligado a P3. Verifique se, assim que atingido, o limite de duration < 500, o servo para de girar no sentido horário. ' ' ' ' O que é um Microcontrolador - ServoControlWithPushbuttons.bs2 Pressione e segure o botão P4 parar girar o servo no sentido antihorário, ou pressione o botão P3 para girar o servo no sentido horário. ' {$STAMP BS2} ' {$PBASIC 2.5} duration VAR duration = 750 PAUSE 1000 DO Word IF IN3 = 1 THEN IF duration > 500 THEN duration = duration - 25 ENDIF ENDIF IF IN4 = 1 THEN IF duration < 1000 THEN duration = duration + 25 ENDIF ENDIF PULSOUT 14, duration PAUSE 10 DEBUG HOME, DEC4 duration, " = duration" LOOP Sua Vez – Limites Mecânicos vs Limites de Software Travas mecânicas do servo evitam que o servo vire além de cerca de 0° e 180°, que correspondem a argumentos PULSOUT Duration próximos de 250 e 1250. O ServoControlWithPushbuttons.bs2 também tem limites de software, impostos pelas Página - 111 declarações IF...THEN que impedem você de usar um botão para girar o servo além de um certo ponto. Em contraste com os limites mecânicos, os limites de software são muito fáceis de ajustar. Por exemplo, você pode dar ao botão de controle do servo uma maior amplitude de movimento, simplesmente substituindo todas as instâncias de 500 por 350, e todos as de 1000 por 1150. Ou você pode atribuir a seu servo uma faixa mais estreita de movimento, substituindo as instâncias de 500 por 650, e as de 1000 por 850. Os limites de software não precisam ser simétricos. Por exemplo, você pode alterar os limites de software a partir do intervalo 500-1000 para o intervalo 350-750. Experimente diferentes limites do servo com o software, incluindo 350-1150, 650-850 e 350-750. Teste cada conjunto de limites de software para ter certeza de que eles funcionam como esperado. Você também pode alterar a rapidez do servo pressionando o botão. Por exemplo, se você alterar no programa os dois valores 25 para 50, o servo irá responder duas vezes mais rápido. Alternativamente, você pode alterá-los para 30, para fazer o servo responder um pouco mais rápido, ou para 20, para fazê-los responder um pouco mais devagar, ou para 10, para fazê-lo responder ainda mais devagar. Tente! SUMÁRIO Este capítulo apresentou um movimento microcontrolado utilizando um Servo Padrão Parallax. Um servo é um dispositivo que se move e mantém uma posição específica com base nos sinais eletrônicos que recebe. Estes sinais tomam a forma de pulsos que duram entre 0,5 e 2,5 ms, e eles têm que ser entregues aproximadamente a cada 20 ms para o servo manter a sua posição. Um programador pode usar o comando PULSOUT para fazer o BASIC Stamp enviar estes sinais. Desde que os pulsos sejam enviados a cada 20 ms, para o servo para manter sua posição, os comandos PULSOUT e PAUSE serão, geralmente, colocados em uma espécie de loop. Variáveis ou constantes podem ser usadas para determinar tanto o número de repetições do loop quanto do argumento Duration do comando PULSOUT. Neste capítulo, foram apresentadas várias maneiras de obter valores para as variáveis. A variável pode receber o valor de seu DEBUG Terminal usando o comando DEBUGIN. O valor da variável pode passar por uma seqüência de valores, se ele for usado com o contra-argumento de um loop FOR...NEXT. Esta técnica pode ser usada para fazer com que o servo faça movimentos de varredura. As declarações IF...THEN podem ser usadas para monitorar os botões e adicionar ou subtrair a variável usada no argumento Duration do comando PULSOUT quando um determinado botão for pressionado. Isto permite o controle da posição e de movimentos radicais dependendo de como o programa for construído e como os botões são operados. Questões 1. Quais são as cinco partes externas de um servo? E para que elas são usadas? 2. É necessário um circuito de LED para que o servo trabalhe? Página - 112 3. Que comando controla o sinal de tempo de baixa enviado para um servo? Que comando controla tempo de alta? 4. Que elemento de programação pode ser utilizado para controlar a quantidade de tempo que um servo mantém uma determinada posição? 5. Como você usa o DEBUG Terminal para enviar mensagens para o BASIC Stamp? Que comando do programa você usa para fazer o BASIC Stamp receber mensagens a partir do DEBUG Terminal? 6. Que tipo de bloco de código que você pode escrever para limitar a amplitude de movimento do servo? Exercícios 1. Faça um bloco de código que varra o valor de PULSOUT controlando um servo a partir de Duration de 700 a 800, e em seguida, volte a 700, em incrementos de (a) 1 e de (b) 4. 2. Adicione um loop FOR...NEXT à sua resposta para o exercício 1b para que ele ofereça dez pulsos antes de incrementar o argumento Duration PULSOUT por 4. Projeto 1. Modifique ServoControlWithDebug.bs2 para que ele monitore uma chave geral. Se a chave geral (botão P3) for pressionada, o DEBUG Terminal não deve aceitar qualquer comando, e deve exibir “Pressione chave de Start para iniciar”. Quando a chave Start (botão P4) for pressionada, o programa deve funcionar normalmente. Se a energia for desconectada e reconectada, o programa deve se comportar como se a chave geral tivesse sido pressionada. Soluções Q1.1)Plug – conecta o servo a energia e fontes de sinal, 2) Cabo - conduz energia e sinais do plug para o servo; 3) Horn - parte móvel do servo; 4) Parafuso – liga o horn do servo ao eixo de saída, 5) Caixa - contém motor CC, engrenagens, e circuitos de controle. Q2.Não, o LED apenas nos ajuda a ver o que está acontecendo com os sinais de controle. Q3.O tempo de baixa é controlado com o comando PAUSE. O de alta é controlado com o comando PULSOUT. Q4.Um loop FOR...NEXT. Q5.Escreva mensagens na janela de transmissão do DEBUG Terminal. Use o comando DEBUGIN e uma variável para fazer o BASIC Stamp receber os caracteres. Q6.Q.6 Ou uma declaração IF...THEN ou um comando que usa os operadores MAX e MIN para manter a variável dentro de certos intervalos. E1. a) Incrementos de 1 FOR counter = 700 TO 800 PULSOUT 14, counter PAUSE 20 NEXT FOR counter = 800 TO b) Adicione STEP 4 para ambos loops FOR...NEXT. FOR counter = 700 TO 800 STEP 4 PULSOUT 14, counter PAUSE 20 Página - 113 700 PULSOUT 14, counter PAUSE 20 NEXT NEXT FOR counter = 800 TO 700 STEP 4 PULSOUT 14, counter PAUSE 20 NEXT E2. Suponha que uma variável denominada pulso tenha sido declarada: FOR counter = 700 TO 800 STEP 4 FOR pulses = 1 TO 10 PULSOUT 14, counter PAUSE 20 NEXT NEXT FOR counter = 800 TO 700 STEP 4 FOR pulses = 1 TO 10 PULSOUT 14, counter PAUSE 20 NEXT NEXT 1. Há muitas soluções possíveis, duas são dadas aqui. ' ' ' ' O que é um Microcontrolaor - Ch04Prj01Soln1__KillSwitch.bs2 Envia mensagens ao BASIC Stamp para controlar o servo usando o Debug Terminal desde que a chave geral não esteja sendo pressionada. ' Contribuição de: Professor Clark J. Radcliffe, Departamento ' de Engenharia Mecânica, Michigan State University ' {$STAMP BS2} ' {$PBASIC 2.5} counter VAR Word pulses VAR Word duration VAR Word DO PAUSE 2000 IF (IN3 = 1) AND (IN4 = 0) THEN DEBUG "Pressiona chave de Start para iniciar. ,CRSRUP ELSEIF (IN3 = 0) AND (IN4 = 1) THEN DEBUG CLS, "Informe número de pulsos:", CR DEBUGIN DEC pulses DEBUG "Informe PULSOUT duration:", CR DEBUGIN DEC duration DEBUG "Servo em movimento...", CR FOR counter = 1 TO pulses PULSOUT 14, duration PAUSE 20 ", CR Página - 114 NEXT DEBUG "Pronto!" PAUSE 2000 ENDIF LOOP Abaixo está uma versão que pode até mesmo detectar o botão pressionado enquanto está enviando um sinal para o servo. Isso é importante para as máquinas que precisam parar imediatamente quando a chave geral é pressionada. Ele utiliza a técnica de espera que foi introduzida no jogo reação de tempo no Capítulo 3, Atividade #5, em três lugares diferentes no programa. Você pode verificar que o programa para de enviar um sinal de controle para o servo, monitorando o sinal de luz do LED indicador ligado ao P14. ' ' ' ' O que é um Microcontrolador - Ch04Prj01Soln2__KillSwitch.bs2 Envia mensagens ao BASIC Stamp para controlar o servo usando o Debug Terminal desde que a chave geral não esteja sendo pressionada. ' {$STAMP BS2} ' {$PBASIC 2.5} counter pulses duration VAR VAR VAR Word Word Word PAUSE 1000 DEBUG "Pressione chave de Start (P4) para iniciar.", CR DO:LOOP UNTIL IN4 = 1 DEBUG "Pressione chave geral (P3) para parar.", CR DEBUG CR, CR, "Tempo de execução do servo:", CR, " ~44 pulsos em 1 segundo", CR, "Posição do servo:", CR, " 350 <= PULSOUT Duration <= 1150", CR, CR DO IF IN3 = 1 THEN DEBUG "Pressione chave de Start (P4) para iniciar.", CR DO:LOOP UNTIL IN4 = 1 DEBUG "Pressione chave geral (P3) para parar.", CR ENDIF DEBUG "Informe tempo de execução como ", CR, "número de pulsos: " DEBUGIN DEC pulses DEBUG "Informe posição como ", CR, "PULSOUT Duration: " DEBUGIN DEC duration duration = duration MIN 350 MAX 1150 DEBUG "Servo em movimento...", CR FOR counter = 1 TO pulses Página - 115 PULSOUT 14, duration PAUSE 20 IF IN3 = 1 THEN DEBUG "Pressione chave de Start (P4) para iniciar.", CR DO:LOOP UNTIL IN4 = 1 DEBUG " Pressione chave geral (P3) para parar.", CR ENDIF NEXT DEBUG "Pronto!", CR, CR PAUSE 1000 LOOP Página - 116 Capítulo 5: Medindo a Rotação AJUSTANDO OS MOSTRADORES E MÁQUINAS DE MONITORAMENTO Muitas casas têm seletores para controlar a iluminação de uma sala. Gire o seletor em um sentido e a iluminação ficará mais clara; gire o seletor em outro sentido e a iluminação ficará mais amena. Algumas miniaturas de trens usam seletores para controlar a direção e a velocidade do motor. Muitas máquinas têm seletores ou manivelas que são usadas para afinar a posição das lâminas de corte e orientar a área de ação. Seletores também podem ser encontrados em equipamentos de áudio, que são usados para ajustar o volume da música e da voz. A Figura 5-1 mostra um exemplo simples de um seletor com um botão que ao girar ajusta o volume do alto-falante. Girando o botão, um circuito dentro do alto-falante faz com que o volume da música no alto-falante também mude. Circuitos similares também podem ser encontrados dentro de joysticks, e até mesmo dentro do servo utilizado no Capítulo 4: Controle de Movimento. Figura 5-1 Ajuste de volume em um alto-falante O RESISTOR VARIÁVEL SOB O SELETOR - UM POTENCIÔMETRO O dispositivo dentro de muitos seletores de um sistema de som, de joysticks e dos servos é chamado de potenciômetro, muitas vezes abreviado como um "pot". A Figura 5-2 mostra uma imagem com alguns potenciômetros comuns. Note-se que todos eles têm três pinos. Figura 5-2 Alguns exemplos potenciômetros A Figura 5-3 mostra o símbolo esquemático e desenho da peça do potenciômetro que você vai usar neste capítulo. Os terminais A e B estão ligados a um componente resistente de 10 kΩ. O terminal W é chamado wiper terminal, e está ligado a um fio que toca o componente resistente em algum ponto entre as suas extremidades. Página - 117 Figura 5-3 Símbolo esquemático do Potenciômetro e desenho da peça. A Figura 5-4 mostra como o wiper de um potenciômetro funciona. Quando você ajustar o botão na parte superior do potenciômetro, o wiper terminal fica em contato com o componente resistivo em diferentes posições. Conforme você gira o botão no sentido horário, o wiper fica mais próximo do terminal A, e conforme você gira o botão no sentido anti-horário, o wiper fica mais próximo do terminal B. Figura 5-4 Ajustando o wiper terminal do potenciômetro ATIVIDADE #1: CONSTRUINDO E TESTANDO O CIRCUITO DO POTENCIÔMETRO Introduzir resistores de diferentes tamanhos, em série, com um LED faz com que diferentes quantidades de corrente fluam através do circuito. Uma resistência maior no circuito de LED faz com que uma menor quantidade de corrente flua através do circuito e o LED brilhe com menos força. Pequenas resistências no circuito LED provocam mais corrente fluindo através do circuito e o LED fica mais brilhante. Ao ligar os terminais do potenciômetro a W e A, em série, com um circuito de LED, você pode usá-lo para ajustar a resistência no circuito. Este, por sua vez, ajusta o brilho do LED. Nesta atividade, você vai usar o potenciômetro como um resistor variável para mudar o brilho do LED. Peças do Circuito do Regulador (1) Potenciômetro – 10 kΩ (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (1) LED – vermelho (1) Fio Construindo o Teste do Circuito do Potenciômetro A Figura 5-5 mostra um circuito que pode ser utilizado para ajustar a luminosidade do LED com um potenciômetro. Construa o circuito mostrado na Figura 5-5. Página - 118 Dica: Se você tiver problemas para manter o potenciômetro nos soquetes do protoboard, verifique suas pernas. Se cada uma tem uma pequena curva, usar um alicate de bico para endireitá-las e, em seguida, tente ligar o potenciômetro no protoboard novamente. Quando as pernas do potenciômetro estão retas, elas conseguem manter um contato melhor com os soquetes do protoboard. Figura 5-5 Circuito de Teste do LED com potenciômetro Testando o Circuito do Potenciômetro Gire o potenciômetro no sentido horário até que ele atinja o seu limite mecânico mostrado na Figura 5-6 (a). Pressione um pouco o potenciômetro contra o protoboard quando você for girar o seu botão. Para essas atividades, o potenciômetro deve estar firmemente assentado nas bases do protoboard. Se você não tiver cuidado quando girar o botão, o potenciômetro pode se desligar dos soquetes do protoboard, o que pode acarretar medições incorretas. Então, aplique um pouco de pressão para baixo quando você girar o botão do potenciômetro para mantê-lo no protoboard. Cuidado ao manusear: Se o potenciômetro não girar até aqui, não tente forçálo. Basta girá-lo até que ele atinja o seu limite mecânico, caso contrário, ele pode quebrar. Gire o potenciômetro no sentido anti-horário gradualmente para as posições mostradas na Figura 5-6 (b), (c), (d), (e) e (f), observando o brilho do LED em cada posição. (a) (b) (c) (d) (e) (f) Figura 5-6 Botão do potenciômetro (a) até (f) mostra o wiper terminal do potenciômetro ajustado para diferentes posições. Como Funciona o Circuito do Potenciômetro A resistência total no seu circuito de teste é de 220 Ω mais a resistência entre os terminais A e W do potenciômetro. A resistência entre os terminais A e W aumenta à Página - 119 medida que o botão é ajustado no sentido anti-horário, o que por sua vez, reduz a corrente através do LED, tornando a luz mais fraca. ATIVIDADE #2: MEDINDO A RESISTÊNCIA AO MEDIR O TEMPO Esta atividade introduz uma nova peça chamada capacitor. Um capacitor opera como uma bateria recarregável que mantém a sua carga por curtos períodos de tempo. Esta atividade também introduz RC-time, que é uma abreviatura de tempo de resistorcapacitor. RC-time é a medida de tempo que o capacitor gasta para perder uma certa quantidade de sua carga armazenada ao enviar corrente ao resistor. Você vai ficar mais familiarizado com o RC-time ao medir o tempo que o capacitor leva para descarregar com diferentes tamanhos de resistores e capacitores. Nesta atividade, você vai programar o BASIC Stamp para carregar um capacitor e, em seguida, medir o tempo que leva para descarregar através de um resistor. Apresentando o Capacitor A Figura 5-7 mostra o símbolo esquemático e o desenho da peça para o tipo de capacitor utilizado nesta atividade. O valor de capacitância é expresso em microfarads (µF), e a medição é comumente impressa nos capacitores. A caixa cilíndrica deste capacitor especial é chamada de canister. Este tipo de capacitor, chamado capacitor eletrolítico, deve ser manuseado com cuidado. Leia o quadro ATENÇÃO. ATENÇÃO: Este capacitor tem um terminal positivo (+) e um negativo (-). O terminal negativo é o condutor que sai do recipiente de metal mais próximo da faixa com um sinal negativo (-). Certifique-se sempre de conectar esses terminais como mostrado nos diagramas de circuitos. Se conectar um desses capacitores incorretamente, você pode danificá-los. Em alguns circuitos, se ligar este tipo de capacitor de forma incorreta e, em seguida, conectar a energia, poderá acontecer uma ruptura ou até mesmo uma explosão. ATENÇÃO: Não aplicar mais tensão para um capacitor eletrolítico além da permitida para manuseio. A voltagem está impressa no lado da caixa. ATENÇÃO: É recomendado o uso de óculos de proteção ou de equipamento de segurança. 3300 µF Figura 5-7 Símbolo esquemático do capacitor de 3300 µF e desenho da peça 3300 µF + - Preste muita atenção aos condutores e como eles se conectam aos terminais positivo e negativo. Página - 120 Peças do Circuito de Resistência e Tempo (1) Capacitor – 3300 µF (1) Capacitor – 1000 µF (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (1) Resistor – 470 Ω (amarelo-violeta-marrom) (1) Resistor – 1 kΩ (marrom-preto-vermelho) (1) Resistor – 2 kΩ (vermelho-preto-vermelho) (1) Resistor – 10 kΩ (marrom-preto-laranja) Construindo e Testando o Circuito de Tempo de Resistor-Capacitor (RC) A Figura 5-8 mostra o esquema do circuito e a Figura 5-9 mostra o diagrama de fiação para esta atividade. Você medirá o tempo, utilizando diferentes valores de resistência no lugar do resistor denominado Ri. Leia cuidadosamente o quadro de SEGURANÇA. Segurança Sempre observe a polaridade quando ligar o capacitor 3300 ou 1000 µF. Lembre-se, o terminal negativo é o condutor que sai do recipiente de metal mais próximo da faixa com um sinal negativo (-). Use a Figura 5-7 para identificar os terminais (+) e (-). Seu capacitor 3300 µF vai funcionar bem neste experimento, desde que você tenha certeza que os terminais positivo (+) e negativo (-) estão ligados exatamente como mostrado nas Figura 5-8 e 5-9. Nunca inverta a polaridade da fonte 3300 µF ou qualquer outra polaridade do capacitor. A tensão nos terminais do capacitor (+) tem de ser sempre maior do que a tensão no seu terminal (-). Vss é a tensão mais baixa (0 V) no Board of Education e no BASIC Stamp HomeWork Board. Ao ligar o terminal negativo do capacitor para Vss, você garante que a polaridade entre os terminais do capacitor seja sempre correta. Nunca aplique voltagem no capacitor que exceda a voltagem indicada nele. Use equipamento de segurança ou óculos de proteção durante esta atividade. Sempre desconecte a alimentação antes de construir ou modificar circuitos. Mantenha as mãos longe deste capacitor quando a alimentação estiver ligada. Com a alimentação desligada, construa o circuito, como mostrado, começando com um resistor 470 Ω no lugar da resistência denominada Ri. P7 220 Ω Ri 3300 µF Vss R1 = 470 Ω R2 = 1 kΩ R3 = 2 kΩ R4 = 10 kΩ Figura 5-8 Esquema para testar a queda de tensão em RC-time As quatro resistências diferentes serão usadas, uma de cada vez, no esquema com Ri. Página - 121 Quatro resistências diferentes serão utilizadas no lugar de Ri como mostrado no esquema. Primeiro, o esquema será construído e testado com Ri = 470 Ω, e, mais tarde com Ri = 1 kΩ etc. R2 R3 R4 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vin Vss - 3 0 30 µF + Vdd X3 Figura 5-9 Diagrama de fiação para visualização da queda de tensão em RC-time R1 Certifique-se de que o condutor negativo do capacitor é ligado na placa da mesma forma que é mostrado na figura, com o polo negativo ligado ao Vss. + Certifique-se de que o condutor negativo do capacitor é ligado na placa da mesma forma que é mostrado na figura, com o polo negativo ligado ao Vss. Captação do Circuito RC-Time com o BASIC Stamp Embora um cronômetro possa ser usado para gravar o tempo que a carga do capacitor cai um certo nível, o BASIC Stamp também pode ser programado para monitorar o circuito e dar uma medida de tempo mais consistente. Exemplo de Programa: PolledRcTimer.bs2 Coloque e execute PolledRcTimer.bs2. Observe como o BASIC Stamp carrega o capacitor e depois mede o tempo de descarga. Anote o tempo medido (tempo de descarga do capacitor) na linha 470Ω da Tabela 5-1. Desligue a energia do seu Board of Education ou do BASIC Stamp HomeWork Board. Retire o resistor 470Ω marcado como Ri nas Figuras 5-8 e 5-9 na página 3, e substitua-o por um resistor de 1 kΩ. Reconecte a energia de sua placa. Grave a sua próxima medição de tempo (para o resistor de 1 kΩ). Repita essas etapas para cada valor de resistor da Tabela 5-1. Tabela 5 1: Resistência e RC-time para C= 3300 µF Resistência (Ω) 470 1k 2k 10 k Medida de tempo (s) Página - 122 ' O que é um Microcontrolador - PolledRcTimer.bs2 ' Programa de tempo de reação modificado para acompanhar o tempo de ' queda de tensão. ' {$STAMP BS2} ' {$PBASIC 2.5} timeCounter counter PAUSE 1000 VAR VAR Word Nib DEBUG CLS HIGH 7 DEBUG "Capacitor carregando...", CR FOR counter = 5 TO 0 PAUSE 1000 DEBUG DEC2 counter, CR, CRSRUP NEXT DEBUG CR, CR, "Medindo o tempo de queda agora!", CR, CR INPUT 7 DO PAUSE 100 timeCounter = timeCounter + 1 DEBUG ? IN7 DEBUG DEC5 timeCounter, CR, CRSRUP, CRSRUP LOOP UNTIL IN7 = 0 DEBUG CR, CR, CR, "O tempo de queda RC foi ", DEC timeCounter, CR, "décimos de segundo.", CR, CR END Como Funciona PolledRcTimer.bs2 Duas variáveis são declaradas. A variável timeCounter é usada para controlar quanto tempo o capacitor leva para descarregar através de Ri. A variável counter é usada para realizar uma contagem regressiva enquanto o capacitor está carregando. timeCounter counter VAR VAR Word Nib O comando DEBUG CLS limpa o DEBUG Terminal para que ele não fique confuso com medições sucessivas. HIGH 7 determina P7 alto e começa a carregar o capacitor, em seguida, é exibida a mensagem “Capacitor carregando...”. Depois disso, enquanto o capacitor está carregando um loop FOR...NEXT faz a contagem regressiva. Da mesma forma que as cargas do capacitor a voltagem através de seus terminais aumenta para qualquer lugar entre 3,4 e 4,9 V (dependendo do valor com Ri). DEBUG CLS HIGH 7 DEBUG "Capacitor carregando...", CR Página - 123 FOR counter = 5 TO 0 PAUSE 1000 DEBUG DEC2 counter, CR, CRSRUP NEXT A mensagem informa quando a queda começa a ser captada. DEBUG CR, CR, " Medindo o tempo de queda agora!", CR, CR A fim de deixar o capacitor descarregar através do resistor Ri, o pino de I/O é alterado de HIGH para INPUT. Como entrada, o pino de I/O, não tem efeito no circuito, mas pode detectar sinais de alta ou baixa. Logo que o pino de I/O liberta o circuito, o capacitor descarrega e alimenta a corrente através do resistor. Assim que o capacitor descarregar, a voltagem entre seus terminais fica cada vez menor (decai). INPUT 7 No capítulo que fala sobre botões, você usou o BASIC Stamp para detectar um sinal alto ou baixo usando as variáveis IN3 e IN4. Lá, um sinal de alta Vdd foi considerado e um sinal de baixa Vss foi considerado. Na verdade, para o BASIC Stamp, um sinal de alta é qualquer voltagem acima de cerca de 1,4 V. É claro que poderia ser de até 5 V. Da mesma forma, um sinal de baixa é qualquer coisa entre 1,4 V e 0 V. Este DO...LOOP verifica P7 cada 100 ms até o valor de IN7 mudar de 1 para 0, o que indica que a voltagem do capacitor decaiu para 1,4 V. DO PAUSE 100 timeCounter = timeCounter + 1 DEBUG ? IN7 DEBUG DEC5 timeCounter, CR, CRSRUP, CRSRUP LOOP UNTIL IN7 = 0 O resultado é então exibido e o programa termina. DEBUG CR, CR, CR, "O tempo de queda RC foi ", END DEC timeCounter, CR, "décimos de segundo.", CR, CR Sua Vez – Circuito Mais Rápido Ao usar um capacitor, que tem cerca de 1/3 da capacidade para armazenar carga, a medição de tempo, para cada valor do resistor, utilizada no circuito será reduzida em 1/3. Posteriormente, na próxima atividade, você vai usar um capacitor que tem 1/33 000 de capacidade! O BASIC Stamp ainda vai medir o tempo para você, usando o comando chamado RCTIME. Desconecte a energia do seu Board of Education ou do HomeWork Board. Página - 124 Substitua o capacitor de 3300 µF pelo capacitor de 1000 µF. Verifique se a polaridade do seu capacitor está correta. O terminal negativo deve ser conectado a Vss. Reconecte a energia. Repita as etapas do Programa de Exemplo na seção: PolledRcTimer.bs2, e grave as suas medições de tempo na Tabela 5-2. Compare suas medições de tempo com as que você obteve anteriormente na Tabela 5-1. Quão próximas elas estão do valor das medições de 1/3 realizadas com o capacitor 3300 µF? Tabela 5-2: Resistência e RC-time para C = 1000 µF Resistência (Ω) Medida de tempo (s) 470 1k 2k 10 k ATIVIDADE #3: LENDO UM SELETOR COM O BASIC STAMP Na Atividade #1, um potenciômetro foi utilizado como um resistor variável. O resistor no circuito variou, dependendo da posição do botão de regulagem do potenciômetro. Na Atividade # 2, um circuito RC-time foi usado para medir as diferentes resistências. Nesta atividade, você vai construir um circuito RC-time para ler o potenciômetro, e usar o BASIC Stamp para fazer as medições de tempo. O resistor utilizado vai ser muito pequeno e as medições de tempo vão estar em intervalos de microssegundos. Mesmo que as medidas sejam de períodos muito curtos de tempo, o BASIC Stamp vai lhe dar uma excelente indicação da resistência entre os terminais A e W do potenciômetro que por sua vez indicará a posição do botão. Peças para Leitura do RC-Time com o BASIC Stamp (1) Potenciômetro – 10 kΩ (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (2) Fios (1) Capacitor – 0.1 µF (1) Capacitor – 0.01 µF Estes capacitores não têm terminais + e -. Eles são não-polarizados. Assim, você pode conectar, com segurança, esses capacitores em um circuito sem se preocupar com os terminais positivos e negativos. Página - 125 104 0.1 µF 0.01 µF 103 Figura 5-10 Capacitores de cerâmica Capacitor 0.1 µF (à esquerda) Capacitor 0.01 µF (à direita) Construindo um Circuito de Tempo RC para o BASIC Stamp Figura 5-11 mostra um esquema e diagrama de fiação para o circuito rápido com RCtime. Este é o circuito que você vai usar para monitorar a posição do botão do potenciômetro com a ajuda do BASIC Stamp e do programa PBASIC. Construa o circuito mostrado na Figura 5-11. Figura 5-11 Esquema e diagrama de fiação para o circuito RCTIME do BASIC Stamp com potenciômetro Programando as Medidas com RC-Time O programa de exemplo na Atividade #2 mediu o tempo de queda RC, verificando se IN7 = 0 a cada 100 ms, mantendo o controle de quantas vezes ele teve que fazer a verificação. Quando IN7 mudou de 1 para 0, indicou que a voltagem do capacitor decaiu para 1,4 V. O resultado, quando foi feita uma pesquisa do programa, foi que a variável timeCounter armazenou um número em décimos de segundo levando a voltagem do capacitor a decair para 1,4 V. O seguinte programa de exemplo usa um comando PBASIC chamado RCTIME que faz com que o BASIC Stamp meça o tempo de queda RC em termos de unidades de 2 μs. Então, ao invés de usar segundos, o resultado RCTIME 7, 1, time armazena na variável time na unidade de dois milionésimos de segundo para que a voltagem do capacitor decaia abaixo de 1,4 V. Uma vez que o comando RCTIME tem essas unidades de medida finas, você pode reduzir o tamanho do capacitor de 3300 μF para 0,1 ou Página - 126 também 0,01 μF, e ainda obter medições de tempo que indicam o valor do resistor. Uma vez que a resistência entre o terminal A do potenciômetro muda quando você gira o botão, a medição RCTIME lhe dará a medida de tempo correspondente a posição do botão do potenciômetro. Exemplo de Programa: ReadPotWithRcTime.bs2 Coloque e execute ReadPotWithRcTime.bs2 Tente girar o botão do potenciômetro durante a monitorização do valor da variável de tempo, utilizando o DEBUG Terminal. Lembre-se de aplicar um pouco de pressão para baixo para manter o potenciômetro preso ao protoboard quando você girar o seu botão. Se o seu servo começar a se mexer, de forma inesperada, em vez de manter a sua posição, um potenciômetro mal colocado pode ser o culpado. ' O que é um Microcontrolador - ReadPotWithRcTime.bs2 ' Leia o potenciômetro no circuito de tempo RC usando o comando ' RCTIME. ' {$STAMP BS2} ' {$PBASIC 2.5} time VAR Word PAUSE 1000 DO HIGH 7 PAUSE 100 RCTIME 7, 1, time DEBUG HOME, "time = ", DEC5 time LOOP Sua Vez – Alterando o Tempo Pela Mudança do Capacitor Substitua o capacitor de 0,1 µF pelo capacitor 0,01 µF. Experimente as mesmas posições, que você fez na atividade principal, no potenciômetro e compare o valor exibido no DEBUG Terminal com os valores obtidos para o capacitor de 0,1 µF. São as medidas RCTIME cerca de um décimo do valor para uma determinada posição do potenciômetro? Volte para o capacitor 0,1 µF. Com o capacitor 0,1 µF de volta no circuito e o capacitor 0,01 µF removido, gire o botão do potenciômetro ao seu limite em ambos os sentidos e faça anotações dos maiores e menores valores para a próxima atividade. Maior:_________ Menor:_________ Como Funciona o ReadPotWithRcTime.bs2 A Figura 5-12 mostra como os comandos HIGH, PAUSE e RCTIME no ReadPotWithRcTime.bs2 interagem com o circuito na Figura 5-11. Página - 127 Figura 5-12: Voltagem para P7 entre HIGH, PAUSE, e RCTIME À esquerda, o comando HIGH 7 faz com que o BASIC Stamp conecte internamente o seu pino de I/O P7 a 5 V de alimentação (Vdd). A corrente de alimentação flui através do resistor do potenciômetro e também carrega o capacitor. Quanto mais próximo o capacitor estiver de alcançar a sua carga final (quase 5 V), menos corrente passa através dele. O comando PAUSE 100 faz, principalmente, uma atualização do display do DEBUG Terminal cerca de 10 vezes por segundo; PAUSE 1 é geralmente suficiente para carregar o capacitor. À direita, o comando RCTIME 7, 1, time muda a direção do pino de I/O de saída para entrada e começa a contar o tempo em incrementos de 2 μs. Como entrada, o pino de I/O, não fornece o circuito com 5 V. Na verdade, a entrada, é praticamente invisível para o circuito RC. Assim, o capacitor começa a perder sua carga através do potenciômetro. Como o capacitor perde sua carga, sua voltagem decai. O comando RCTIME mantém a contagem de tempo até P7 sentir um sinal baixo, ou seja, a voltagem através do capacitor decai para 1,4 V, no ponto em que ele armazena a sua medição na variável time. A Figura 5-12 também mostra um gráfico de voltagem através do capacitor durante os comandos HIGH, PAUSE e RCTIME. Em resposta ao comando HIGH 7, que liga o circuito de 5 V, o resistor carrega rapidamente. Então, ele permanece em seu nível de voltagem final durante a maior parte do comando PAUSE 100. Quando o programa chega ao comando RCTIME 7, 1, a direção do pino de I/O muda, assim o capacitor começa a descarregar através do potenciômetro. Quando o capacitor descarrega, a voltagem de P7 decai. Quando a voltagem decai para 1,4 V (marca de 150 μs neste exemplo), o comando RCTIME para a contagem de tempo e armazena o resultado da medição da variável time. Uma vez que o comando RCTIME conta o tempo em duas unidades μs, o resultado de 150μs que fica armazenado na variável time é 75. Página - 128 I/O Pin Logic Threshold: 1,4 V é o limite da lógica de um pino de I/O do BASIC Stamp 2. Quando o pino de I/O está configurado para entrada, armazena um 1 na sua entrada de registro se a voltagem aplicada for superior a 1,4 V ou um 0 se a voltagem de entrada for de 1,4 V ou inferior. No primeiro exemplo de botão no Capítulo 3, Atividade #2 foi aplicado 5 V ou 0 V para P3. Desde 5 V seja acima de 1,4 V, IN3 armazena um 1, e desde 0 V seja inferior a 1,4 V, IN3 armazena um 0. Argumento State do RCTIME: Em ReadPotWithRcTime.bs2, a voltagem através do capacitor decai quase 5 V, e quando alcança 1,4 V, o valor em IN7 registra alterações 1 a 0. Nesse ponto, o comando RCTIME armazena a sua medição em Duration, que é a variável de tempo no programa de exemplo. O comando RCTIME argumento State é de 1 em RCTIME 7, 1, time, que informa ao comando RCTIME que o IN7 irá armazenar a 1 quando a medição começar. O comando RCTIME mede quanto tempo o registro IN7 leva para mudar para o lado oposto, o que acontece quando a voltagem decai abaixo de 1,4V do limite da lógica do pino de I/O. Para mais informações: Procure o comando RCTIME tanto no manual do BASIC Stamp como no BASIC Stamp Editor’s Help. A Figura 5-13 mostra como o tempo de decaimento muda com a resistência do potenciômetro para o circuito na Figura 5-11. Cada posição do botão do potenciômetro o ajusta em uma determinada resistência. Se girar em uma direção a resistência aumenta e em outra a resistência diminui. Quando a resistência for maior, o decaimento demora mais tempo, e o comando RCTIME armazena um valor maior da variável time. Quando a resistência é menor, o decaimento leva um tempo mais curto, e o comando RCTIME armazena um valor menor na variável time. O comando DEBUG em ReadPotWithRcTime.bs2 exibe esta medição de tempo no DEBUG Terminal, desde que as mudanças de tempo de decaimento com a resistência do potenciômetro, que por sua vez variam com a posição do botão do potenciômetro, o número exibido no DEBUG Terminal indica a posição do botão. Figura 5-13 Como a resistência do potenciômetro afeta o tempo de decaimento Página - 129 Por que a carga do capacitor tem uma voltagem mais baixa, quando o potenciômetro tem menos resistência? Dê uma olhada no esquema, no canto superior esquerdo da Figura 5-12 na página 3. Sem o resistor de 220 Ω, o pino de I/O seria capaz de carregar o capacitor a 5 V, mas o resistor de 220 Ω é necessário para evitar possíveis danos do pino de I/O a partir de uma corrente de ligação quando o capacitor começar a ser carregado. Ele também impede que o potenciômetro extraia muito mais corrente se estiver a 0 Ω, enquanto o pino de I/O envia seu sinal de alta de 5 V. Com 5 V aplicado através da resistência 220 Ω em cadeia com o potenciômetro, a voltagem entre eles tem que ter alguma fração de 5 V. Quando duas resistências do condutor de corrente são colocadas em cadeia, que resulta em uma voltagem intermediária, o circuito é chamado divisor de voltagem (voltage divider). Assim, resistor de 220 Ω e o potenciômetro formam um circuito divisor de tensão, e para obter qualquer resistência do potenciômetro (Rpot), você pode usar esta equação para calcular a voltagem sobre o potenciômetro (Vpot): Vpot V = 5 × Rpot ÷ (Rpot + 220 Ω) O valor da Vpot estabelece o limite de tensão do capacitor. Em outras palavras, qualquer voltagem através do potenciômetro poderia ser se o capacitor não estivesse ligado, é a voltagem que o capacitor pode carregar, e não superiores. Para a maioria das faixas do botão do potenciômetro, os valores de resistência estão em kΩ, e quando você calcular Vpot para valores, Rpot em kΩ os resultados estarão muito mais próximos de 5 V. O resistor de 220 Ω não impede Vpot carregar acima de 1,4 V até que o valor do potenciómetro esteja abaixo de 85,6 Ω, que é inferior a 1% da amplitude de movimento do potenciômetro. Este 1% resultaria em menores medições de qualquer maneira, por isso é difícil dizer que as medições nesta escala são nada fora do comum. Mesmo com o adicional de 220 Ω os resistores construídos no BASIC Stamp HomeWork Board com conexões de pinos I/O, apenas a faixa do potenciômetro menor que 1,7% é afetada, por isso ainda é praticamente imperceptível. Assim, o resistor de 220 Ω protege o pino de I/O, com um impacto mínimo sobre a capacidade de medição de decaimento RC e mostra onde posicionou o botão do potenciômetro. ATIVIDADE #4: CONTROLANDO O SERVO COM UM POTENCIÔMETRO Os Joysticks de polegar, como o mostrado na Figura 5-14, são comumente encontrados em controladores de vídeo games. Cada joystick normalmente tem dois potenciômetros que permitem que os componentes eletrônicos no interior do controlador do jogo relatem a posição do joystick para o console de videogame. Um potenciômetro gira com o movimento horizontal do joystick (esquerda/direita), e o outro gira com movimento vertical do joystick (frente/trás). Página - 130 Potenciômetro Horizontal Figura 5-14 Potenciômetros dentro do módulo Joystick de polegar da Parallax Potenciômetr o Vertical Outra aplicação do joystick de polegar que usa potenciômetros é o controlador de rádio RC e o modelo de avião na Figura 4-1 na página 79. O controlador possui dois joysticks, e cada um tem dois potenciômetros. Cada posição do potenciômetro é responsável por controlar um servo diferente sobre o plano de RC. Nesta atividade, você vai usar um potenciômetro semelhante aos encontrados em joysticks de polegar para controlar a posição de um servo. Gire o botão do potenciômetro, o horn de servo irá espelhar este movimento. Esta atividade utiliza dois circuitos, o circuito do potenciômetro da Atividade #3, neste capítulo, e o circuito do servo do Capítulo 4, Atividade #1. O programa PBASIC apresentado neste capítulo mede repetidamente a posição do potenciômetro com um comando RCTIME e, em seguida, utiliza a medição e um pouco de matemática para controlar a posição do servo com um comando PULSOUT. O BASIC Stamp pode medir a posição do joystick. Uma vez que existem dois potenciômetros em cada joystick de polegar, cada um deles pode, por si só, substituir o suporte do potenciômetro nos circuitos na figura 5-11, na página 125. Um comando RCTIME pode medir a posição do potenciômetro vertical, e outra pode medir o potenciômetro horizontal. Peças do Servo Controlado por Potenciômetro (1) Potenciômetro – 10 kΩ (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (1) Resistor – 470 Ω (amarelo-violeta-marrom) (1) Capacitor – 0,1 µF (1) Servo padrão da Parallax (1) LED – qualquer cor (2) Fios O HomeWork Board também vai precisar de: (1) Conector de 3 pinos macho-macho (4) Fios Página - 131 Construindo o Circuito do Servo Controlado por Potenciômetro Esta atividade vai usar dois circuitos que você já construiu individualmente: circuito do potenciômetro da atividade recentemente concluída e o circuito do servo do capítulo anterior. Deixe o seu circuito RC-time do potenciômetro da Atividade # 3 na área de prototipagem. Se você precisar reconstruí-lo, use a Figura 5-11 na página 125. Certifique-se de usar o capacitor 0,1 µF, e não o capacitor 0,01 µF. Adicione seu circuito do servo do Capítulo 4, Atividade #1 ao projeto. Lembrese que o circuito do servo será diferente, dependendo da sua placa de suporte. Abaixo estão as páginas das seções que você precisa ir: o Página 80: Board of Education Servo Circuit o Página 82: BASIC Stamp HomeWork Board Servo Circuit Programando o Servo Controlado por Potenciômetro Você precisará do menor e o maior valor da variável de tempo que você gravou de seu circuito RC-time enquanto estava usando um capacitor de a 0,1 µF. Se você ainda não completou a seção “Sua Vez” da atividade anterior, retorne e a conclua agora. No próximo exemplo, estão os valores de tempo medidos por um técnico da Parallax; seus valores, provavelmente, serão um pouco diferentes: • • Máximo no sentido horário: 1 Máximo no sentido anti-horário: 691 Como ajustar estes valores de entrada para mapear o intervalo de 500-1000 ao controlar o servo com o comando PULSOUT? A resposta é usando multiplicação e adição. Primeiro, multiplique os valores de entrada por algo que faça a diferença entre os valores de 500 em vez de 700 no sentido horário (mínimo) e anti-horário (máximo). Em seguida, adicione um valor constante ao resultado de modo que a sua média seja entre 500 e 1000, em vez de 1 a 500. Na eletrônica, essas operações são chamadas scaling e offset. Veja como funciona o cálculo de multiplicação (scaling): 500 = 691 × 0.724 = 500 691 500 time(minimum) = 1 × = 0.724 691 time(maximum) = 691× Depois que os valores são escalados, aqui estão os passos da adição (offset). time(maximum) = 500 + 500 = 1000 time(minimum) = 0.724 + 500 = 500 Página - 132 O sinal operador */ que foi introduzido na página 69 é construído em PBASIC para o dimensionamento de valores fracionários, como 0,724. Aqui estão os passos para a utilização */ aplicado a 0,724: 1. Coloque o valor ou variável que você deseja multiplicar por um valor fracionário antes do operador */. time = time */ 2. Pegue o valor fracionário que você deseja usar e multiplique por 256. new fractional value = 0.724 × 256 = 185.344 3. Livre-se de qualquer coisa à direita do ponto decimal. new fractional value = 185 4. Coloque esse valor após o operador */ . time = time */ 185 Isso cuidará da escala, agora tudo o que precisamos fazer é adicionar o deslocamento de 500. Isto pode ser feito com um segundo comando, que adiciona 500 ao time: time = time */ 185 time = time + 500 Agora, o time está pronto para ser reciclado no argumento Duration do comando PULSOUT. time = time */ 185 time = time + 500 PULSOUT 14, time ' Scale by 0.724. ' Offset by 500. ’ Envie um pulso para o servo. Exemplo de Programa: ControlServoWithPot.bs2 Coloque e execute o programa, depois gire o botão do potenciômetro, e certifique-se que os movimentos do servo são reflexo dos movimentos do potenciômetro. ' O que é um Microcontrolador - ControlServoWithPot.bs2 ' Lê o potenciômetro no circuito de tempo RC usando o comando RCTIME. ' Multiplica o tempo por 0,724 e adiciona 500 para o servo. ' {$STAMP BS2} ' {$PBASIC 2.5} PAUSE 1000 DEBUG "Programa funcionando!" time VAR Word Página - 133 DO HIGH 7 PAUSE 10 RCTIME 7, 1, time time = time */ 185 time = time + 500 PULSOUT 14, time ' Multiplica por 0,724 (X 256 para */). ' Adiciona 500. ' Envia pulso ao servo. LOOP Sua Vez – Multiplicando a Relação do Servo com o Seletor Seu potenciômetro e capacitor, provavelmente, darão valores de tempo que são um pouco diferentes dos discutidos nesta atividade. Estes são os valores que você coletou na seção “Sua Vez” na atividade anterior. Repita o cálculo discutido na seção “Programando o Servo Controlado por Potenciômetro” na página 131, usando seu valores máximos e mínimos. Substitua sua escala e valores de deslocamento em ControlServoWithPot.bs2. Comente DEBUG "Programa funcionando!" com um apóstrofo no início da linha. Adicione esta linha de código entre os comandos PULSOUT e LOOP para que você possa ver os seus resultados: DEBUG HOME, DEC5 time ‘ Mostra o valor de tempo ajustado Execute o programa modificado e verifique o seu andamento. Como os valores foram arredondados, os limites podem não ser exatamente 500 e 1000, mas eles devem ser muito próximos. Declarando Constantes e Diretivas Pin Em programas maiores, você pode terminar usando o valor ScaleFactor (que foi de 185) e o deslocamento (que era de 500) muitas vezes no programa. Números como 185 e 500 em seu programa são chamados constantes, porque ao contrário das variáveis, seus valores não podem ser alterados enquanto o programa está sendo executado. Em outras palavras, o valor continua a ser "constante". Você pode criar nomes para essas constantes com as diretivas CON: ScaleFactor Offset delay CON CON CON 185 500 10 Estas diretivas CON são quase sempre declaradas próximas ao início do programa, de modo que elas são fáceis de encontrar. Uma vez que aos valores constantes foram dados nomes com as diretivas CON, você pode usar o ScaleFactor no lugar de 185 e deslocamento (offset) no lugar de 500 em seu programa. Por exemplo: time = time */ scaleFactor time = time + offset 500”. “ ' Escala de 0.724.” “ ' Deslocamento de Página - 134 Com os valores nós nomes às constantes com diretivas CON, os comandos são: time = time */ 185 time = time + 500 “ ' Escala de 0.724”. “ ' Deslocamento de 500.” Uma vantagem importante para o uso de constantes é que você pode alterar uma diretiva CON, e atualizar cada instância desse nome constante no seu programa. Por exemplo, se você escrever um programa grande que usa o ScaleFactor constante em 11 locais diferentes, uma mudança do ScaleFactor CON ..., em todas as instâncias de ScaleFactor em seu programa, usará esse valor atualizado para baixar o próximo programa. Então, se você mudou o ScaleFactor CON 500 para ScaleFactor CON 510, todos os comandos com ScaleFactor vão usar 510 em vez de 500. Você também pode dar aos pinos de I/O nomes usando as diretivas PIN. Por exemplo, você pode declarar uma diretiva PIN para o pino de I/O P7 assim: RcPin PIN 7 Existem dois pontos no exemplo de programa anterior, onde o número 7 é utilizado para se referir ao pino de I/O P7. O primeiro pode agora ser escrito como: HIGH RcPin O segundo pode ser escrito como: RCTIME RcPin, 1, time Se mais tarde você mudar o seu circuito para usar diferentes pinos de I/O, tudo que você tem a fazer é alterar o valor na sua diretiva PIN, e ambos os comandos HIGH e RCTIME serão atualizados automaticamente. Da mesma forma, se você tem que recalibrar o scale factor ou offset, você também pode simplesmente mudar as diretivas CON no início do programa. A diretiva PIN tem um recurso adicional: O compilador PBASIC pode detectar se o nome do pino é usado como uma entrada ou saída, e substituir o número do pino de I/O para saída ou o correspondente registro de entrada da variável bit para entrada. Por exemplo, você poderia declarar duas diretivas de pinos, como LedPin PIN 14 e ButtonPin PIN 3. Em seguida seu código pode fazer uma declaração como IF ButtonPin = 1 THEN HIGH LedPin. O compilador PBASIC converte isso para IF IN3 = 1 THEN HIGH 14. O IF ButtonPin = 1... fez uma comparação, e o compilador PBASIC sabe que você está usando ButtonPin como entrada. Por isso, utiliza o registro de entrada bit IN3, em vez do número 3. Da mesma forma, o compilador sabe que o PBASIC HIGH LedPin usa o pino com o nome LedPin como valor constante 14 para uma operação de saída, então ele substitui HIGH 14. Programa de Exemplo: ControlServoWithPotUsingDirectives.bs2 Coloque e execute ControlServoWithPotUsingDirectives.bs2. Página - 135 Observe como este programa responde ao potenciômetro e verifique se ele se comporta da mesma maneira com o ControlServoWithPot.bs2 ' O que é um Microcontrolador - ControlServoWithPotUsingDirectives.bs2 ' Lê o potenciômetro no circuito de tempo RC usando o comando RCTIME. ' Aplica fator de escala e offset, então envia o valor para o servo. ' {$STAMP BS2} ' {$PBASIC 2.5} rcPin servoPin PIN PIN 7 14 ' Definições de pinos de I/O scaleFactor offset delay CON CON CON 185 500 10 ' Declaração de constantes time VAR Word ' Declaração de variáveis PAUSE 1000 ' Inicialização DO HIGH rcPin PAUSE delay RCTIME rcPin, 1, time time = time */ scaleFactor time = time + offset PULSOUT servoPin, time DEBUG HOME, DEC5 time ' Rotina principal ' Medição de queda RC ' Escala scaleFactor. ' Offset por offset. ' Envia pulso ao servo. ' Mostra valor do tempo ajustado. LOOP Sua vez – Atualizando a Diretiva PIN Como mencionado anteriormente, se você ligar o circuito RC a um pino de I/O diferente, você pode simplesmente mudar o valor da diretiva RcPin PIN, e esta mudança automaticamente se reflete nos comandos time HIGH RcPin e RCTIME RcPin, 1. Salve o exemplo de programa com um novo nome. Altere scaleFactor e compense os únicos valores que você determinou na sua seção anterior “Sua Vez” para o circuito RC. Execute o programa modificado e verifique se ele funciona corretamente. Modifique o circuito movendo a conexão do circuito RC–time do pino de I/O P7 para o pino de I/O P8. Modifique a declaração rcPin para que seja lido assim: rcPin PIN 8 Reexecute o programa e verifique se os comandos HIGH e RCTIME ainda estão funcionando corretamente sobre os diferentes pinos de I/O com apenas uma alteração da diretiva PIN RcPin. Página - 136 SUMÁRIO Este capítulo apresentou o potenciômetro, peça frequentemente encontrada em vários botões e seletores. O potenciômetro tem um elemento resistivo que tipicamente conecta seus dois terminais externos e um terminal do limpador que contata um ponto variável sobre o elemento resistivo. O potenciômetro pode ser utilizado como uma resistência variável, se o terminal do limpador e um dos dois terminais externos for utilizados num circuito. O capacitor também foi introduzido neste capítulo. Um capacitor pode ser usado para armazenar e libertar carga. A quantidade de carga que um capacitor pode armazenar está relacionada com o seu valor, que é medido em farads (F). O símbolo µ é a notação de engenharia para micro, e significa um milionésimo. Os condensadores utilizados nas atividades deste capítulo variaram de 0,01 para 3300 µF. Uma resistência e um condensador podem ser ligados entre si num circuito que leva um certo período de tempo para carga e descarga. Este circuito é comumente referido como um circuito RC-time. O R e o C em RC-time significam resistência e condensador. Quando um valor (C nas atividades deste capítulo) é constante, a variação de tempo necessária para que o circuito descarregue está relacionada com o valor de R. Quando o valor de R muda, o valor do tempo que leva para o circuito carregar e descarregar também muda. O tempo total que o circuito RC-time leva para descarregar pode ser dimensionado usando um condensador de um tamanho diferente. O assentamento foi utilizado para monitorar o tempo de descarga de um capacitor em um circuito RC onde o valor de C, era muito grande. Vários resistores diferentes foram utilizados para mostrar como as alterações do tempo de descarga mudam quando o valor do resistor no circuito muda. O comando RCTIME foi então usado para monitorar um potenciômetro (um resistor variável) de um circuito RC-time com capacitores de valor menor. Embora esses capacitores façam com que os tempos de descarga na faixa de cerca de 2 a 1500 µs (milionésimos de segundo), o BASIC Stamp não tem nenhum problema de rastreamento dessas medições de tempo com o comando RCTIME. O pino de I/O deve ser estabelecido HIGH e então o capacitor no circuito RC-time poderá ser carregado usando PAUSE antes do comando RCTIME. Programação em PBASIC pode ser usada para medir um sensor resistivo tal como um potenciômetro e dimensionar seu valor de modo que seja útil para outro dispositivo, tal como um servo motor. Trata-se de realizar operações matemáticas sobre o tempo de descarga RC medido, que um comando RCTIME armazena em uma variável. Esta variável pode ser ajustada pela adição de um valor constante para isso, o que é útil para o controle de um servo. Na seção Projetos, você pode encontrar também multiplicação e divisão. A diretiva CON pode ser utilizada no início de um programa para substituir um nome por um valor constante (um número). Depois que uma constante foi nomeada, o nome pode ser usado no lugar do número em todo o programa. Isto pode ajudar, especialmente se você precisa usar o mesmo número em 2, 3, ou até mesmo 100 lugares diferentes no programa. Você pode alterar o número na diretiva CON, e todas 2, 3, ou até 100 diferentes instâncias desse número serão atualizadas automaticamente na próxima vez que você executar o programa. Diretivas PIN permitem nomear pinos de I/O. O nome Página - 137 do pino I/O é sensível ao contexto, assim o compilador PBASIC substitui o número do pino de I/O correspondente pelo nome do pino nos comandos como HIGH, LOW, e RCTIME. Se o nome do pino vir a ser habitual em uma instrução condicional ele substituirá o registro de entrada por IN2, IN3 etc. Questões 1. Quando você gira o seletor ou o botão em um aparelho de som, qual componente você está provavelmente ajustando? 2. Em um potenciômetro típico, a resistência entre os dois terminais externos pode ser ajustada? 3. Quão semelhante é um capacitor de uma bateria recarregável? Como ele se diferencia? 4. O que você pode fazer com um circuito RC-time para lhe dar uma indicação do valor de um resistor variável? 5. O que acontece com o tempo de descarga RC, se o valor de R (o resistor) tornarse maior ou menor? 6. O que a diretiva CON faz? Explique isto em termos de um nome e de um número. Exercícios 1. Vamos dizer que você tem um capacitor 0,5 µF no circuito RC timer, e você quer que a medida fique dez vezes maior. Calcule o valor do novo capacitor. Projetos 1. Adicione um circuito de LED bicolor na Atividade # 4. Modifique o programa de exemplo para que o LED bicolor fique vermelho quando o servo estiver girando no sentido anti-horário, verde quando o servo estiver girando no sentido horário, e desligado quando o servo permanecer na sua posição. 2. Use IF...THEN para modificar o primeiro exemplo de programa da Atividade #4 para que o servo só gire entre os valores PULSOUT de 650 e 850. Soluções Q1.O Potenciômetro. Q2.Não, ela é fixa. A resistência variável é entre um terminal externo e o wiper terminal (meio). Q3.Um capacitor é semelhante a uma bateria recarregável, que pode ser carregado para manter a tensão. A diferença é que ele só aguenta a carga por um período muito curto de tempo. Q4. Você pode medir o tempo que leva para o capacitor descarregar (ou carregar). Este tempo está relacionado com a resistência e a capacitância. Se a capacitância for conhecida e a resistência variável, o tempo de descarga dará a indicação da resistência. Q5.Se R ficar maior, o tempo de descarga RC aumentará na proporção direta ao aumento de R. Se R ficar menor, o tempo de descarga RC diminuirá na proporção direta à diminuição de R. Q6.As diretivas CON substituem um nome por um número. E1. Novo capacitor = (10 x valor do velho capacitor) = (10 x 0.5µF) = 5 µF Página - 138 E1. Atividade #4 com LED bicolor adicionado. P13 Esquema do Potenciômetro da Figura 5-11 na página 125, servo do Capítulo 4m Atividade #1, e LED bicolor da Figura 2-19 na página 45 com P15 e P14 mudados para P13 e P12, como mostrado. 1 2 P12 470 Ω ' ' ' ' ' ' ' ' O que é um Microcontrolador - Ch5Prj01_ControlServoWithPot.bs2 Lê o potenciômetro no circuito de tempo RC usando o comando RCTIME. Usa o resultado RCTIME na variável time para controlar a posição do servo. LED bicolor em P12, P13 dita a direção de rotação do servo: verde para SH, vermelho para SAH, apagado quando o servo está parado. ' {$STAMP BS2} ' {$PBASIC 2.5} PAUSE 1000 DEBUG "Programa funcionando!" time prevTime VAR VAR Word Word ' Leitura de tempo do potenciômetro ' Leitura anterior DO prevTime = time HIGH 7 PAUSE 10 RCTIME 7, 1, time time = time */ 185 time = time + 500 PULSOUT 14, time ' Armazena leitura de tempo anterior ' Lê potenciômetro usando RCTIME ' Escala de 0,724 (X 256 for */). ' Offset de 500. IF ( time > prevTime + 2) THEN ' Aumenta, potenciômetro gira SAH HIGH 13 ' LED bicolor vermelho LOW 12 ELSEIF ( time < prevTime - 2) THEN 'Diminui potenciômetro gira SH LOW 13 ' LED bicolor verde HIGH 12 ELSE ' Servo mantém posição LOW 13 ' LED apagado LOW 12 ENDIF LOOP P2. A chave é adicionar blocos de IF ... THEN, um exemplo é mostrado abaixo. CLREOL é um personagem de controle de depuração útil que significa "claro para o fim da linha". ' O que é um Microcontrolador - Ch5Prj02_ControlServoWithPot.bs2 ' Lê o potenciômetro no circuito de tempo RC usando o commando ' RCTIME. Página - 139 ' ' ' ' Modificado com IF…THEN para que o servo apenas gire de 650 a 850. A variável time vai de 1 a 691, então um offset de, no mínimo, 649 é necessário. ' {$STAMP BS2} ' {$PBASIC 2.5} PAUSE 1000 DEBUG "Programa funcionando!" time VAR Word DO HIGH 7 PAUSE 10 ' Lê o potenciômetro com RCTIME RCTIME 7, 1, time time = time + 649 IF (time time = ENDIF IF (time time = ENDIF < 650) THEN 650 ' Escala time para variação do servo ' Restringe variação para 650 a 850 > 850) THEN 850 PULSOUT 14, time DEBUG HOME, "time = ", DEC4 time, CLREOL LOOP Página - 140 Capítulo 6: Display Digital O DISPLAY DIGITAL COTIDIANO A Figura 6-1 mostra um display na parte da frente da porta de um forno. Quando o aparelho não está em uso, ele exibe a hora. Quando em uso exibe o temporizador do forno, configurações para cozimento, e pisca ao mesmo tempo que um alarme soa para que você saiba que a comida está pronta. Um microcontrolador dentro da porta do forno monitora os botões e atualiza os mostradores. Ele também monitora os sensores dentro dos dispositivos do forno e muda os dispositivos que ligam os componentes de aquecimento em ligado e desligado. Figura 6-1 Relógio digital de display de 7 segmentos na porta do forno. Cada um dos três dígitos na Figura 6-1 é chamado de display de 7 segmentos. Neste capítulo, você vai programar o BASIC Stamp para exibir números e letras em um display de 7 segmentos. O QUE É UM DISPLAY DE 7 SEGMENTOS? Um display de 7 segmentos é um bloco retangular de 7 linhas de igual comprimento que podem ser iluminadas com LEDs seletivamente, para exibir dígitos e algumas letras. A Figura 6-2 mostra uma parte do desenho do display do LED de 7 segmentos que você vai usar nas atividades deste capítulo. Também tem um ponto que pode ser usado como um ponto decimal. Cada um dos segmentos (A a G) e do ponto contém um LED separado, que pode ser controlado individualmente. A maioria dos pinos tem um número junto com uma etiqueta que corresponde a um dos segmentos de LED. O pino 5 rotulado DP significa ponto decimal. Os pinos 3 e 8 são rotulados como "cátodo comum" (“common cathode”), e eles serão explicados quando o esquema para esta parte for introduzido. Common Cathode 10 9 8 7 6 A B G F A F B G C E D E D C DP 1 2 3 4 5 Common Cathode Figura 6-2 Desenho da peça e mapa de pinos do display de 7 segmentos de LED Página - 141 Mapa de pinos: A Figura 6-2 é um exemplo de mapa de pinos. O mapa de pinos contém informações úteis que ajudam você a conectar uma peça a outros circuitos. Mapas de pinos, usualmente, mostram o número e o nome de cada pino e a sua referência. Dê uma olhada na Figura 6-2. Cada pino é numerado, e o nome de cada pino é a letra segmento próxima ao pino. A referência para esta parte é o ponto decimal. Oriente a área para que o ponto decimal fique no canto inferior direito. Então você pode ver a partir do pino no mapa que o pino 1 no canto inferior esquerdo, e os números dos pinos aumentam no sentido anti-horário em torno do caixa. A Figura 6-3 mostra um esquema dos LEDs dentro do display de LED de 7 segmentos. Cada ânodo do LED está ligado a um pino individual. Todos os cátodos estão ligados entre si por fios no interior da peça. Porque todos os cátodos partilham uma ligação comum, o display de LED de 7 segmentos pode ser chamado de um display de cátodo comum. Ao ligar tanto o pino 3 ou 8 na peça para Vss, você vai conectar todos os cátodos do LED para Vss. 1 4 6 7 9 10 5 E C B A F G DP LED’s 3 Figura 6-3 Esquema do display de LED de 7 segmentos 8 ATIVIDADE #1: CONSTRUINDO E TESTANDO O DISPLAY DE LED DE 7 SEGMENTOS Nessa atividade, você construirá manualmente circuitos para testar cada segmento do display. Peças para o Teste do Display de LED de 7 Segmentos (1) Display de LED de 7 segmentos (5) Resistores – 1 kΩ (marrom-preto-vermelho) (1) Fio Teste dos Circuitos do Display de LED de 7 Segmentos Com a energia do seu Board of Education ou HomeWork Board desconectada, construa o circuito mostrado na Figura 6-4 e na Figura 6-5. Reconecte a energia e verifique se o segmento A emite luz. O que é o x com o nc acima dele no esquema? O nc representa não conectado ou sem conexão. Ele indica que um determinado pino no display de LED de 7 segmentos não está ligado a nada. O x na extremidade do pino, também significa não ligado. Esquemas, às vezes, usam apenas o x ou apenas o nc. Página - 142 Vdd nc X X X nc nc nc X nc X nc X nc X 1 kΩ 1 4 6 7 9 10 5 E C B A F G DP Figura 6-4 Esquema do teste de circuito para o segmento “A” do display de LED LED’s 8 X 3 nc Vss X3 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vdd Vin Figura 6-5 Diagrama de fiação do teste de circuito para o segmento “A” do display de LED Vss Desconecte a energia e modifique o circuito conectando o resistor à entrada do LED B conforme mostrado na Figura 6-6 e na Figura 6-7. Vdd X nc nc nc X X nc X nc X nc X nc X 1 kΩ 1 4 6 7 9 10 5 E C B A F G DP LED’s 8 X 3 Vss nc Figura 6-6 Esquema do teste de circuito para o segmento “B” do display de LED Página - 143 X3 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vdd Vin Figura 6-7 Diagrama de fiação do teste de circuito para o segmento “B” do display de LED Vss Reconecte a energia e verifique se o segmento B emite luz. Usando o mapa de pinos da Figura 6-2 como guia, repita esses passos para os segmentos C a G. Sua Vez – O Número 3 e a Letra H A Figura 6-8 e a Figura 6-9 mostram o digito “3” conectado no display de LED de 7 segmentos. Vdd Vdd Vdd Vdd Vdd 1 kΩ (all) nc nc X X X nc 1 4 6 7 9 10 5 E C B A F G DP Figura 6-8 Dígito “3” conectado. LED’s 8 X 3 nc Vss X3 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vdd Vin Vss Figura 6-9 Diagrama de Fiação para a Figura 6-8 Construa e teste o circuito mostrado nas Figura 6-8 e Figura 6-9, e verifique se o número 3 é exibido. Página - 144 Desenhe um esquema que mostra o número 2 no LED de 7 segmentos. Construa e teste o circuito, para verificar se ele funciona. Solucione o problema, se necessário. Determine o circuito necessário para a letra "H" e, em seguida, construa-o e teste. ATIVIDADE #2: CONTROLANDO O DISPLAY DE LED DE 7 SEGMENTOS Nesta atividade, você vai conectar o display de LED de 7 segmentos no BASIC Stamp e, em seguida, executar um programa simples para testar e ter certeza se cada LED está conectado corretamente. Peças do Display de LED de 7 Segmentos (1) Display LED de 7 segmentos (8) Resistores - 1 kΩ (marrom-preto-vermelho) (5) Fios Conectando o Display de LED de 7 Segmentos no BASIC Stamp A Figura 6-11 mostra o esquema e a Figura 6-12 mostra o diagrama de fiação para este exemplo de controle de display de LED de 7 segmentos do BASIC Stamp. Construa o circuito mostrado na Figura 6-11 e na Figura 6-12. Esquema e Mapa de Pinos: Se você está tentando construir o esquema de circuito da Figura 6-11 sem depender da Figura 6-12, certifique-se de consultar o mapa de pinos do display de LED de 7 segmentos, mostrado aqui novamente na Figura 6-10 por conveniência. Common Cathode 10 9 8 7 6 A B G F A F B G C E D E D C DP 1 2 3 4 5 Common Cathode Figura 6-10 Desenho da peça e mapa de pinos do display de LED de 7 segmentos. Página - 145 1 kΩ (All) P15 P14 P13 P12 P11 P10 P9 P8 E C G DP F A LED’s B Figura 6-11 Esquema display de LED de 7 segmentos controladado pelo BASIC Stamp common Vss Tenha cuidado com os resistores ligados a P13 e P14. Olhe atentamente para os resistores ligados a P13 e P14 na Figura 6-12. Há um vão entre esses dois resistores. O vão é mostrado porque o pino 8 no display de 7 segmentos do LED é deixada desligada. Um resistor conecta o pino de I/O P13 para o pino 9 do display de LED de 7 segmentos. Outro resistor liga P14 ao pino 7 do display de LED de 7 segmentos. DP EDC GFAB X3 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vdd Figura 6-12 Diagrama de Fiação para a Figura 6-11 Vin Vss Use as letras de segmento acima desse diagrama como referência. Dispositivo Paralelo: O display de LED de 7 segmentos é chamado de dispositivo paralelo, porque o BASIC Stamp tem que usar um grupo de linhas de I/O para enviar dados (informação de alta e baixa) para o dispositivo. No caso deste display de LED de 7 segmentos, são necessários 8 pinos de I/O para instruir ao dispositivo o que exibir. Barramento Paralelo: Os fios que transmitem os sinais de baixa / alta do BASIC Stamp para o display de LED 7 segmentos são chamados de barramento paralelo. Note-se que estes fios são desenhados como linhas paralelas na Figura 6-11. O termo "paralelo" faz sentido, dada a geometria do esquema. Página - 146 Programando o Teste do Display de LED de 7 Segmentos Os comandos de HIGH e LOW vão aceitar uma variável como um argumento Pin. Para testar cada segmento, um de cada vez, basta colocar os comandos HIGH e LOW em um loop FOR ... NEXT, e usar o índice para definir o pino I/O de alta, depois o de baixa novamente. Digite e execute SegmentTestWithHighLow.bs2. Verifique se todos os segmentos do LED de 7 segmentos acendem as luzes brevemente, ligando e em seguida desligando novamente. Relacione qual segmento o pino de I/O controla. Programa de Exemplo: SegmentTestWithHighLow.bs2 ' O que é um Microcontrolador - SegmentTestWithHighLow.bs2 ' Teste individualmente cada segment em um display de LED de 7 ' segmentos. '{$STAMP BS2} '{$PBASIC 2.5} pinCounter VAR Nib PAUSE 1000 DEBUG "Pino de I/O", CR, "-------", CR FOR pinCounter = 8 TO 15 DEBUG DEC2 pinCounter, CR HIGH pinCounter PAUSE 1000 LOW pinCounter NEXT Sua Vez - um Padrão Diferente Removendo o comando LOW pinCounter, será obtido um efeito interessante: Comente o comando LOW pinCounter adicionando um apóstrofo à esquerda. Execute o programa modificado e observe o efeito. ATIVIDADE #3: EXIBINDO DÍGITOS Se você incluir o ponto decimal, há oito pinos de I/O diferentes no BASIC Stamp que enviam sinais de baixa / alta para o display de LED de 7 segmentos. São oito comandos HIGH ou LOW diferentes para exibir apenas um número. Se você contar de zero a nove, seria uma vasta quantidade de programação. Felizmente, existem variáveis especiais que você pode usar para definir os valores máximos e mínimos para os grupos dos pinos de I/O. Nesta atividade, você vai usar números binários de 8 dígitos em vez dos comandos HIGH e LOW para controlar os sinais de alta/baixa enviados pelos pinos de I/O para o BASIC Stamp. Ao definir variáveis especiais chamadas DIRH e OUTH iguais aos Página - 147 números binários, você será capaz de controlar os sinais de baixa/alta enviados por todos os pinos de I/O conectados ao circuito de 7 segmentos do LED com um único comando PBASIC. 8 bits: Um número binário que tem 8 dígitos diz-se que tem 8 bits. Cada bit é um slot onde você pode armazenar ou 1 ou 0. Um byte é uma variável, que contém 8 bits. Existem 256 combinações diferentes de zeros e uns, que você pode usar para contar de 0 a 255, com 8 bits. É por isso que uma variável de byte pode armazenar um número entre 0 e 255. Peças e Circuito para Exibição de Dígitos As mesmas da atividade anterior Programando Padrões de On / Off Usando Números Binários Nesta atividade, você vai experimentar as variáveis DIRH e OUTH. DIRH é uma variável que controla a direção (entrada ou saída) dos pinos de I/O P8 a P15. OUTH controla os sinais altos ou baixos que cada um destes pinos de I/O envia. Você verá brevemente que OUTH é especialmente útil, pois você pode usá-lo para definir os sinais de alta/baixa para oito pinos de I/O diferentes de uma só vez com apenas um comando. Aqui está um exemplo de programa que mostra como essas duas variáveis podem ser usadas para contar de 0 a 9, no display de 7 segmentos do LED, sem usar os comandos HIGH e LOW: Programa de Exemplo: DisplayDigits.bs2 Esse programa de exemplo irá fazer com que o display de LED de 7 segmentos alterne os dígitos de 0 à 9. Coloque e execute DisplayDigits.bs2. Verifique se os dígitos de 0 a 9 são exibidos. ' O que é um Microcontrolador - DisplayDigits.bs2 ' Exibe dígitos de 0 à 9 no display de LED de 7 segmentos. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Program Running!" OUTH = %00000000 DIRH = %11111111 ' BAFG.CDE OUTH = %11100111 PAUSE 1000 OUTH = %10000100 PAUSE 1000 OUTH = %11010011 PAUSE 1000 OUTH = %11010110 PAUSE 1000 OUTH = %10110100 PAUSE 1000 OUTH = %01110110 PAUSE 1000 ' OUTH inicializado em baixa. ' Configura P8-P15, todas saídas em baixa. ' Dígito: ' 0 ' 1 ' 2 ' 3 ' 4 ' 5 Página - 148 OUTH = %01110111 PAUSE 1000 OUTH = %11000100 PAUSE 1000 OUTH = %11110111 PAUSE 1000 OUTH = %11110110 PAUSE 1000 ' 6 DIRH = %00000000 ' Pinos de I/O para entrada, ' Segmentos apagados. ' 7 ' 8 ' 9 END Como Funciona o DisplayDigits.bs2 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 X3 Vdd Vin Vss A Figura 6-13 mostra como você pode usar as variáveis DIRH e OUTH para controlar a direção e definir os estados (de alta/baixa) dos pinos de I/O P8 a P15. Figura 6-13 Usando DIRH e OUTH para configurar todos os pinos de I/O para saída baixa. OUTH = %00000000 DIRH = %11111111 O primeiro comando: OUTH = %00000000 ... deixa todos os pinos de I/O (P8 a P15) prontos para enviar os sinais de baixa. Se todos eles enviarem sinais de baixa, eles desligarão todos os segmentos no display de LED de 7 segmentos. Se você quisesse que todos os pinos de I/O enviassem um sinal de alta, você poderia usar OUTH =% 11111111. O que % faz? O formatador binário % é usado para dizer ao BASIC Stamp Editor que o número é um número binário. Por exemplo, o número binário %00001100 é o mesmo que o número decimal 12. Como você vai ver nesta atividade, números binários podem fazer facilmente muitas tarefas de programação. Os sinais de baixa não serão realmente enviados pelos pinos de I/O até que você use a variável DIRH para mudar todos os pinos de I/O de entrada para a saída. O comando: DIRH = %11111111 Página - 149 ... define os pinos de I/O P8 a P15 para a saída. Assim que este comando é executado, de P8 a P15, todos, começarão a enviar sinais de baixa. Isso ocorre porque o comando OUTH = %00000000 foi executado pouco antes do comando DIRH. Assim que o comando DIRH definir todos os pinos de I/O para a saída, eles começarão a enviar seus sinais de baixa. Você também pode usar DIRH =% 00000000 para mudar todos os pinos de I/O de volta para entrada. Antes dos pinos de I/O se tornarem saídas: até os pinos de I/O serem alterados de entrada para saída, eles apenas ficam atentos aos sinais e atualizam a variável INH. Esta é a variável que contém IN8, IN9 até IN15. Essas variáveis podem ser usadas da mesma forma que IN3 e IN4 foram usadas para leitura dos botões no Capítulo 3. Todos os pinos de I/O no BASIC Stamp começam como entrada. Isso é chamado de padrão (default). Você tem que dizer ao pino de I/O do BASIC Stamp para iniciar como saída, antes que ele comece enviar um sinal de alta ou baixa. Ambos os comandos HIGH e LOW mudam automaticamente a direção de um pino de I/O do BASIC Stamp para saída. Colocar um 1 na variável DIRH também muda um dos pinos de I/O para saída. Sempre definir valores em um determinado registro OUT antes de fazer as saídas com os valores no registro DIR correspondente. Isso evita o envio de breves sinais não intencionais. Por exemplo, se DIR5 = 1 é seguido por OUT5 = 1, no início de um programa, será enviado um breve sinal de baixa, não intencional, antes de mudar para alta porque OUT5 armazena 0, quando o programa é iniciado. (Inicializar todas as variáveis/registros no PBASIC com 0.) Se OUT5 = 1 for seguido por DIR5 = 1, o pino de I / O irá enviar um sinal de alta, tão logo ele se torne uma saída. Uma vez que os valores armazenados são 0 por todas as variáveis padrão quando o programa é iniciado, o comando OUTH =% 00000000 é realmente redundante. A Figura 6-14 mostra como usar a variável OUTH, para seletivamente, enviar sinais de alta e baixa para P8 a P15. O binário-1 é usado para enviar um sinal de alta, e binário-0 é usado para enviar um sinal de baixa. Esse exemplo mostra o número três no display de LED de 7 segmentos: ' BAFG.CDE OUTH = %11010110 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 X3 Vdd Vin Vss Página - 150 Figura 6-14 Usando OUTH para controlar os sinais de alta e baixa do P8 – P15 ‘ BAFG.CDE OUTH = %11010110 O display está ligado e o número três no display está de cabeça para baixo, para mostrar, de modo mais claro, os valores da linha OUTH até os pinos de I/O. O comando OUTH =% 11010110 usa zeros binários para definir pinos de I/O P8, P11, P13 baixo, e usa os binários para definir P9, P10, P12, P14 e P15 alto. A linha pouco antes do comando é um comentário que mostra os rótulos do segmento alinhados com o valor binário que transforma esse segmento on / off. Dentro dos comandos HIGH e LOW: HIGH 15 ...é o mesmo que: OUT15 = 1 DIR15 = 1 Da mesma forma, o comando : LOW 15 ...é o mesmo que: OUT15 = 0 DIR15 = 1 Se você quiser retornar P15 para entrada, use DIR15 = 0. Você pode então usar IN15 para detectar (em vez de enviar) sinais de alta / baixa. Sua Vez – Exibindo de A à F Descubra quais padrões de bits (combinações de zeros e outros) você precisará para exibir as letras A, b, C, d, E e F. Modifique DisplayDigits.bs2 para que ele exiba A, b, C, d, E, F. Decimal vs. Hexadecimal Os dígitos básicos no sistema de numeração decimal (base 10) são: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 No sistema hexadecimal (base-16) os números básicos são: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, C, d, E, F. A base-16 é amplamente utilizada em computadores e na programação de microcontroladores. Depois de descobrir como exibir os caracteres de A à F, você pode modificar o seu programa para que ele conte em hexadecimal de 0 a F. Página - 151 Mantendo Listas de Padões On / Off O comando LOOKUP escreve um código para o display de LED de 7 segmentos exibir padrões com mais facilidade. O comando LOOKUP permite "procurar" elementos em uma lista. Aqui está um exemplo de código que usa o comando LOOKUP: LOOKUP index, [7, 85, 19, 167, 28], value Há duas variáveis utilizadas neste comando, index e value. Se index é 0, valeu armazena 7. Se o index é 1, value armazena 85. No próximo programa de exemplo, index é definido como 2, para o comando LOOKUP colocar 19 em value, e é isso que o DEBUG Terminal exibe. Programa de Exemplo: SimpleLookup.bs2 Coloque e execute SimpleLookup.bs2. Execute o programa como está, com a variável index igual a 2. Tente configurar a variável index igual para números entre 0 e 4. Reexecute o programa depois de cada alteração na variável index e note que o valor da lista é colocado na variável value. Opcional: Modifique o programa, colocando o comando LOOKUP em um loop FOR ... NEXT que conta de 0 a 4. ' O que é um Microcontrolador - SimpleLookup.bs2 ' Debug um valor usando index e uma tabela de consulta. ' {$STAMP BS2} ' {$PBASIC 2.5} value index VAR VAR Byte Nib index = 2 PAUSE 1000 DEBUG ? index LOOKUP index, [7, 85, 19, 167, 28], value DEBUG ? value, CR DEBUG "Mude a variável index para um ", CR, "número diferente (entre 0 e 4).", CR, CR, "Execute o programa modificado e ", CR, "verifique qual número o comando ", CR, "LOOKUP coloca na variável ", CR, "value." END Programa de Exemplo: DisplayDigitsWithLookup.bs2 Este programa de exemplo mostra como o comando LOOKUP pode ser realmente útil para armazenar os padrões de bits usados na variável OUTH. Novamente, a variável index é utilizada para selecionar o valor binário que é colocado na variável OUTH. Este Página - 152 Programa de Exemplo tem a contagem de 0 a 9 novamente. A diferença entre este programa e DisplayDigits.bs2 é que este programa é muito mais versátil. É muito mais rápido e mais fácil de ajustar para sequências de números diferentes, utilizando tabelas de consulta. Coloque e execute DisplayDigitsWithLookup.bs2. Verifique se ele faz a mesma coisa que o programa anterior (com muito menos trabalho). Dê uma olhada no DEBUG Terminal enquanto o programa esta sendo executado. Ele mostra como o valor de index é usado pelo comando LOOKUP para carregar o valor binário correto da lista para OUTH. ' O que é um Microcontrolador - DisplayDigitsWithLookup.bs2 ' Use uma tabela de consulta para armazenar e exibir dígitos com o ' display de LED de 7 segmentos. '{$STAMP BS2} '{$PBASIC 2.5} index VAR Nib OUTH = %00000000 DIRH = %11111111 PAUSE 1000 DEBUG "index "----- OUTH ", CR, --------", CR FOR index = 0 TO 9 LOOKUP index, [ %11100111, %10000100, %11010011, %11010110, %10110100, %01110110, %01110111, %11000100, %11110111, %11110110 ], OUTH DEBUG " ", DEC2 index, " PAUSE 1000 NEXT ", BIN8 OUTH, CR DIRH = %00000000 END Sua Vez – Exibindo 0 à F novamente Modifique DisplayDigitsWithLookup.bs2 para que ele conte de 0 à F em hexadecimal. Não se esqueça de atualizar o argumento EndValue do loop FOR...NEXT. ATIVIDADE #4: EXIBINDO A POSIÇÃO DE UM DIAL No Capítulo 5, Atividade #4 utilizou o potenciômetro para controlar a posição de um servo. Nesta atividade, você vai mostrar a posição do potenciômetro usando o display de LED de 7 segmentos. Peças do Dial e Display (1) Display LED de 7 segmentos (8) Resistores – 1 kΩ (marrom-preto-vermelho) Página - 153 (1) Potenciômetro – 10 kΩ (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (1) Capacitor – 0,1 µF (7) Fios Construindo o Circuito do Dial e Display A Figura 6-15 mostra um diagrama esquemático do circuito do potenciômetro que deve ser adicionado ao projeto. A Figura 6-16 mostra o diagrama de fiação do circuito a partir da Figura 6-15 combinado com o circuito da Figura 6-11, na página 146. Adicione o circuito do potenciômetro ao circuito do display de LED de 7 segmentos, conforme mostrado na Figura 6-16. Figura 6-15 Esquema do circuito do potenciômetro adicionado ao projeto Figura 6-16 Diagrama de fiação para a Figura 6 -15 Programando o Dial e o Display Há um comando bastante útil denominado LOOKDOWN, e sim, ele é o inverso do comando LOOKUP. Enquanto o comando LOOKUP lhe dá um número com base em um índice, o comando LOOKDOWN lhe dá um índice baseado em um número. Programa de Exemplo: SimpleLookdown.bs2 Este programa de exemplo demonstra como o comando LOOKDOWN funciona. Coloque e execute SimpleLookdown.bs2. Execute o programa como está, com a variável value definida igual a 167, e use o DEBUG Terminal para observar o valor de index. Tente configurar a variável value igual a cada um dos números listados pelo comando LOOKDOWN: 7, 85, 19, 28. Reexecute o programa depois de cada alteração na variável value e note qual valor da lista foi colocado na variável index. Página - 154 Pegadinha: O que acontece se o seu valor for maior que 167? Esta pequena variação no comando LOOKDOWN pode causar problemas porque o comando LOOKDOWN não faz qualquer alteração no índice. ' O que é um Microcontrolador - SimpleLookdown.bs2 ' Debug um índice usando um valor e uma tabela de consulta. ' {$STAMP BS2} ' {$PBASIC 2.5} value index VAR VAR Byte Nib value = 167 PAUSE 1000 DEBUG ? value LOOKDOWN value, [7, 85, 19, 167, 28], index DEBUG ? index, CR DEBUG "Mude a variável value para um ", CR, " número diferente dessa lista:", CR, "7, 85, 19, 167, or 28.", CR, CR, "Execute o programa modificado e ", CR, "verifique qual o número o comando ", CR, "LOOKDOWN colocou na variável ", CR, "index." END A menos que você diga a ele para fazer um tipo diferente de comparação, o comando LOOKDOWN verifica se o valor está igual a uma entrada na lista. Você também pode verificar se um valor é maior que, menor que ou igual a, etc. Por exemplo, para procurar uma entrada em que a variável value é menor que ou igual a, use o operador <= pouco antes da primeira faixa que inicia a lista. Em outras palavras, o operador retorna o índice do primeiro valor na lista que faz a indicação na instrução real. Modifique SimpleLookdown.bs2 substituindo este valor e a declaração LOOKDOWN no lugar dos já existentes: value = 35 LOOKDOWN value, <= [ 7, 19, 28, 85, 167 ], index Modifique o comando DEBUG para que se leia: DEBUG "Mude a variável value para um ", CR, "número diferente, nesta faixa:", CR, "0 à 170.", CR, CR "Execute o programa modificado e ", CR, "verifique qual o número o comando ", CR, "LOOKDOWN colocou na variável ", CR, Página - 155 "index." Experimente com valores diferentes e veja se a variável index mostra o que você tinha em mente. Programa de Exemplo: DialDisplay.bs2 Este programa de exemplo espelha a posição do botão do potenciômetro iluminando os segmentos externos do display de LED de 7 segmentos, conforme mostrado na Figura 6-17. Figura 6-17 Exibindo a posição do potenciômetro com o display de LED de 7 segmentos. Coloque e execute DialDisplay.bs2. Gire o botão do potenciômetro e verifique se ele funciona. Lembre-se de pressioná-lo para baixo para mantê-lo preso à placa do protoboard. Quando você executar o programa de exemplo, a execução pode não ser tão precisa como mostrada na Figura 6-17. Ajuste os valores na tabela de LOOKDOWN para que o display digital exiba uma posição mais precisa do potenciômetro. ' O que é um Microcontrolador - DialDisplay.bs2 ' Exibe a posição do potenciômetro usando um display de LED de 7 ' segmentos. '{$STAMP BS2} '{$PBASIC 2.5} PAUSE 1000 DEBUG "Programa funcionando!" index time VAR VAR Nib Word OUTH = %00000000 DIRH = %11111111 DO HIGH 5 PAUSE 100 RCTIME 5, 1, time LOOKDOWN time, <= [40, 150, 275, 400, 550, 800], index LOOKUP index, [ %11100101, %11100001, %01100001, %00100001, %00000001, %00000000 ], OUTH LOOP Página - 156 Como Funciona o DialDisplay.bs2 Este programa de exemplo toma uma medida RCTIME do potenciômetro e a armazena em uma variável chamada time. HIGH 5 PAUSE 100 RCTIME 5, 1, time A variável time é então usada numa tabela LOOKDOWN. A tabela LOOKDOWN decide qual o número na lista time é menor, em seguida, carrega o número de entrada (de 0 a 5, neste caso) para a variável index. LOOKDOWN time, <= [40, 150, 275, 400, 550, 800], index Em seguida, a variável index é usada em uma tabela LOOKUP para escolher o valor binário a ser carregado na variável OUTH. LOOKUP index, [ %11100101, %11100001, %01100001, %00100001, %00000001, %00000000 ], OUTH Sua Vez – Adicionando um Segmento DialDisplay.bs2 só liga cinco dos seis segmentos quando você gira o botão. A sequência para acender os LEDs no DialDisplay.bs2 é E, F, A, B, C, mas não D. Salve DialDisplay.bs2 como DialDisplayYourTurn.bs2. Modifique DialDisplayYourTurn.bs2 para que ele faça todos os seis LEDs externos ligarem na mesma sequência, conforme o potenciômetro é girado. A sequência deve ser: E, F, A, B, C e D; Dica: Deixe o seu circuito do seu display de LED de 7 segmentos na sua placa. Nós usaremos o LED de 7 segmentos novamente com outros circuitos no Capítulo 7, Atividade #4. SUMÁRIO Este capítulo introduziu o display de LED de 7 segmentos, e como ler um mapa de pinos. Este capítulo introduziu também algumas técnicas para dispositivos e circuitos que têm entradas paralelas. As variáveis DIRH e OUTH foram introduzidas como um meio de controlar os valores dos pinos de I/O P8 a P15 no BASIC Stamp. Os comandos LOOKUP e LOOKDOWN foram introduzidos como um meio de recorrer às listas de valores usados para exibir letras e números. Questões 1. Em um display de LED de 7 segmentos, qual é o ingrediente ativo que faz com que o display fique legível quando um microcontrolador envia um sinal de alta ou baixa? 2. O que significa cátodo comum? O que você acha que ânodo comum significa? 3. Qual é o grupo de fios que conduzem sinais de e para um dispositivo chamado paralelo? Página - 157 4. Quais são os nomes dos comandos neste capítulo que são usados para lidar com listas de valores? Exercícios 1. Escreva um comando OUTH para definir P8, P10, P12 altos e P9, P11, P13 baixos. Supondo que todos os seus pinos de I/O começaram como entrada, escreva o comando DIRH que fará com que os pinos de I/O P8 a P13 enviem sinais de alta / baixa, deixando P14 e P15 configurados como entradas. 2. Adicione os valores de OUTH necessários para fazer as letras: a, C, d, F, H, I, n, P, S. Projeto 1. Soletre "FISH CHIPS And dIP" várias vezes com o seu display de LED de 7 segmentos. Faça com que cada letra dure 400 ms. Soluções Q1.O ingrediente ativo é um LED. Q2.Cátodo comum significa que todos os cátodos estão ligados entre si, ou seja, que partilham um ponto de ligação comum. Ânodo comum significa que todos os ânodos são ligados entre si. Q3.Um barramento paralelo. Q4.LOOKUP e LOOKDOWN usam listas de valores. E1. O primeiro passo para configurar OUTH é definido como "1" em cada posição de bit especificado como HIGH. Então bits 8, 10 e 12 são definidos “1". Em seguida, coloque um "0" para cada baixa, então os bits 9, 11 e 13 recebem um "0", como mostrado. Para configurar DIRH, os pinos especificados como 8, 10, 12, 9, 11 e 13 devem ser definidos como saídas, definindo os bits para "1". 15 e 14 estão configurados como entradas, colocando zeros nos bits 15 e 14. O segundo passo é traduzir isso para uma declaração PBASIC. Bit 15 14 13 12 11 10 OUTH 0 0 0 1 0 1 OUTH = %00010101 9 0 8 1 Bit 15 14 13 12 11 10 DIRH 0 0 1 1 1 1 9 1 8 1 DIRH = %00111111 E2. A chave para resolver este problema é desenhar cada letra e notar quais segmentos devem estar acesos. Coloque um 1 em cada segmento que está aceso. Traduza para o valor binário OUTH. A lista dos segmentos BAFG.CDE para bits em OUTH estão na Figura 6-14 na página 152. Página - 158 Letras LED Segmentos B A F G.C D E OUTH Valor = a e, f, a, b, c, g 11110101 %11110101 C a, f, e, d 01100011 %01100011 d b, c, d, e, g 10010111 %10010111 F a, f, e, g 01110001 %01110001 H f, e, b, c, g 10110101 %10110101 I f, e 00100001 %00100001 n e, g, c 00010101 %00010101 P all but c and d 11110001 %11110001 S a, f, g, c, d 01110110 %01110110 Da Figura 6-2 na página 140. Common Cathode 10 9 8 7 6 G F A B A F B G C E D E D C DP 1 2 3 4 5 Common Cathode P1. Usar o esquema da Figura 6-11 da página 146. Para resolver esse problema, modifique DisplayDigitsWithLookup.bs2, usando os padrões de letras trabalhadas no Exercício 2. Na solução, as letras foram criadas como constantes para tornar o programa mais intuitivo. Usando os valores binários é muito mais fácil, mas mais propenso a erros. ' ' ' ' O que é um Microcontrolador - Ch6Prj01_FishAndChips.bs2 Use uma tabela de consulta para armazenar e exbir dígitos com o display de LED de 7 segmentos. Soletre a mensagem: FISH CHIPS And dIP '{$STAMP BS2} '{$PBASIC 2.5} ' Padrões do display de LED de 7 segmentos para criar letras A CON %11110101 C CON %01100011 d CON %10010111 F CON %01110001 H CON %10110101 I CON %00100001 n CON %00010101 P CON %11110001 S CON %01110110 space CON %00000000 index VAR Byte OUTH = %00000000 DIRH = %11111111 ' 19 caracteres na mensagem ' Todos apagados para começar ' Todos os LEDs devem ser saídas PAUSE 1000 ' 1 s antes da 1a mensagem DO DEBUG "index "----- OUTH ", CR, --------", CR FOR index = 0 TO 18 ' 19 caracteres na mensagem LOOKUP index, [ F, I, S, H, space, C, H, I, P, S, space, Página - 159 A, n, d, space, d, I, P, space ], OUTH DEBUG " PAUSE 400 NEXT LOOP ", DEC2 index, " ", BIN8 OUTH, CR ' 400 ms entre letras Página - 160 Capítulo 7: Medição de Luz DISPOSITIVOS QUE CONTÉM SENSORES DE LUZ Os capítulos anteriores introduziram botões como sensores de contato e pressão e potenciômetros como sensores de rotação e posição. Ambos os sensores são comuns em produtos eletrônicos, basta pensar em quantos dispositivos com botões e mostradores você usa diariamente. Outro sensor comum encontrado em muitos produtos, é o sensor de luz. Aqui estão alguns exemplos de dispositivos que necessitam de sensores de luz para funcionar corretamente: • • • • • • Faróis de carros que, automaticamente, acendem quando está escuro. Iluminação pública que, automaticamente, acende quando está começando a escurecer. Iluminação de segurança ao ar livre, que liga quando alguém passa por ela (mas só à noite). O visor do notebook fica mais brilhante em áreas bem iluminadas e mais escuro em áreas mal iluminadas. Câmeras com ajustes de exposição automática. Sensores dentro de TVs, aparelhos de DVD e outros componentes de sistemas de entretenimento que detectam a luz infravermelha de um controle remoto. Os três primeiros exemplos da lista falam em acendimento automático, e eles dependem de sensores de luz ambiente para distinguir o dia da noite. Os dispositivos eletrônicos dentro desses equipamentos só precisam saber se está claro ou escuro, para que possam tratar seus sensores de luz como saídas binárias, como botões. Notebooks e câmeras de ajuste de exposição automática ajustam para área iluminada condições de obter informação dos sensores de luz sobre quão claro ou escuro está. Eles têm que tratar os seus sensores de luz como saídas analógicas que fornecem um número que indica o quão clara ou escuras estão, muito parecido com os exemplos de potenciômetros do Capítulo 5 onde o número indica a posição do botão. Os sensores de luz dentro das TVs e de outros componentes de sistemas de entretenimento detectam infravermelho (IR), que é uma luz não visível ao olho humano, mas pode ser detectada por vários dispositivos eletrônicos. Por exemplo, se você olhar para o final do controle remoto que você aponta para uma TV ou outros dispositivos de entretenimento, você encontrará um LED IR. Quando você pressionar o botão do controle remoto, ele enviará sinais codificados para o componente do sistema de entretenimento, piscando o IR LED on / off. Como não podemos ver a luz infravermelha, temos a impressão de que o LED do controle remoto não faz nada quando você pressiona o botão. No entanto, se você tentar fazer isso enquanto olha para o LED através da lente de uma câmera digital, o LED vai ficar quase branco. A luz branca contém todas as cores do espectro. Os sensores verdes, azuis e vermelhos dentro de uma câmera com chip, todos, reportarão que detectam luz em resposta a luz branca. Acontece que os sensores de vermelho / verde / azul todos detectam a luz infravermelha do IR LED do controle remoto também. Assim, a câmara também interpreta a luz de um LED de infravermelhos como branca. Página - 161 Mais sobre LEDs infravermelhos e detectores: Robótica com o Boe-Bot tem exemplos onde o robô Boe-Bot controlado pelo BASIC Stamp usa o LED IR, encontrado dentro dos controles remotos de TV, e o receptor IR, encontrado dentro dos aparelhos de TV, para detectar objetos em frente dele. O Boe-Bot usa o LED IR como uma pequena lanterna, e o receptor IR encontrado dentro das TVs para detectar o IR reflexo das lanternas em objetos na frente dele. O controle remoto IR para o Boe-Bot explica como os controles remotos de TV codificam as mensagens que eles enviam para as TVs e tem exemplos de como programar o microcontrolador BASIC Stamp para decodificar as mensagens do controle remoto para que você possa enviar mensagens para o seu robô Boe-Bot, e até mesmo conduzi-lo ao redor, tudo com um controle remoto de TV. O tipo de luz que um determinado dispositivo detecta depende do que ele foi projetado para fazer. Por exemplo, sensores de luz para dispositivos que se ajustam às condições de iluminação do ambiente precisam sentir a luz visível. Os sensores de pixels vermelhos, verdes e azuis dentro câmeras digitais vão detectar cada um dos níveis de cores específicas de uma imagem digital. O sensor IR dentro de uma TV está à procura de luz infravermelha, que está piscando on / off próximo 40 kHz. Estes são apenas alguns exemplos, e cada aplicação requer um tipo diferente de sensor de luz. A Figura 7-1 mostra alguns exemplos dos muitos sensores de luz disponíveis para vários requisitos dos sensores de luz. Da esquerda para a direita, ele mostra um fototransistor, fotoresistor de sulfeto de cádmio, sensor de luz linear, fotodiodo azul realçado, luz para conversor de frequência, fototransistor infravermelho e um receptor remoto infravermelho de uma TV. Figura 7-1: Exemplos de sensores de luz Sobre a célula de sulfeto de cádmio (CdS) ou Fotoresistor A célula de sulfeto de cádmio (CdS), ou fotoresistor, foi um dos sensores de luz ambiente mais comuns em iluminação automática. Com o advento da diretiva da União Europeia da restrição do uso de determinadas Substâncias Perigosas (RoHS), os fotoresistores de sulfeto de cádmio já não podem ser incorporados na maioria dos dispositivos importados ou fabricados na Europa. Isto tem aumentado a utilização de um certo número de produtos em substituição ao fotoresistor, incluindo o fototransistor e sensor de luz linear. Como resultado destas alterações, esta edição apresenta agora um fototransistor que detecta níveis de luz no lugar do fotoresistor de sulfeto de cádmio. A documentação para cada sensor de luz descreve o tipo de luz que ele detecta em termos de comprimento de onda. Comprimento de onda é a medida da distância entre as formas ou ciclos de repetição. Por exemplo, imagine uma onda que viaja através do Página - 162 oceano, subindo e descendo. O comprimento desta onda seria a distância entre cada pico (ou whitecap) de seu ciclo. O comprimento de uma onda de luz pode ser medido de forma semelhante, em vez disto, estamos medindo a distância entre os dois picos nas oscilações eletromagnéticas de luz. Cada cor de luz tem o seu próprio comprimento de onda e é considerada uma luz visível, o que significa que pode ser detectada pelo olho humano. A Figura 7-2 mostra dois comprimentos de onda para a luz visível, bem como para alguns tipos de luz que o olho humano não consegue detectar, incluindo radiação ultravioleta e infravermelha. Estes comprimentos de onda são medidos em nanômetros, que é abreviado nm. Um nanômetro é um bilionésimo de um metro. Figura 7-2: Comprimentos de onda e as suas cores correspondentes Comprimento de 10…380 450 495 570 590 620 onda (nm) Violeta Verde Laranj Cor Ultraviolet Azul Amarel 750…100,00 Infravermelh Vermelho o NOTA: Se você estiver vendo isso no livro impresso em escala de cinza, você pode baixar em PDF, totalmente colorido, pelo site www.parallax.com/go/WAM. INTRODUÇÃO DO FOTOTRANSISTOR Um transistor é como uma válvula que permite que certa quantidade de corrente elétrica passe através de dois dos seus terminais. O terceiro terminal de um transistor controla apenas a quantidade de corrente que passa através dos outros dois. Dependendo do tipo de transistor, o fluxo de corrente pode ser controlado pela tensão, corrente, ou, no caso do fototransistor, pela luz. Figura 7-3 mostra o esquema e desenho da peça para o fototransistor em seu kit “O que é um Microcontrolador. Quanto mais luz atingir o terminal da base do fototransistor (B), mais corrente será conduzida no seu coletor terminal (C), que fluirá para fora do seu emissor terminal (E). Por outro lado, menos luz que brilha sobre o terminal de base resulta em menos corrente conduzida. B Figura 7-3 Símbolo esquemático do Fototransistor e desenho da peça. C B E E C Este pico de sensibilidade do fototransistor é de 850 nm, o que de acordo com a Figura 7-2, está na gama de infravermelhos. Ele também responde a luz visível, embora de maneira um pouco menos sensível, especialmente para os comprimentos de onda abaixo de 450 nm, mostrado em azul na Figura 7-2. A luz halógena e lâmpadas incandescentes e, especialmente, luz solar são fontes muito mais fortes do infravermelho do que as lâmpadas fluorescentes. O transistor infravermelho responde bem a todas estas fontes de Página - 163 luz, mas é mais sensível à luz do sol, em seguida, com lâmpadas de halogêneo e incandescente, e um pouco menos sensível às lâmpadas fluorescentes. Projetos de circuitos, usando o transistor, podem ser ajustados para funcionar melhor em certos tipos de condições de iluminação, e os circuitos do Fototransistor, neste capítulo, são projetados para uso interno. Existe um aplicativo de detecção de luz ao ar livre, mas usaria um dispositivo diferente que possa parecer à primeira vista como um candidato improvável para um sensor de luz: um diodo emissor de luz. ATIVIDADE #1: CONSTRUINDO E TESTANDO O MEDIDOR DE LUZ O Capítulo 5 introduziu medidas de queda de RC com o comando RCTIME para medir o tempo que o capacitor levou para perder sua carga através de um resistor variável dentro de um potenciômetro. Com maior resistência (para o fluxo de corrente elétrica), o potenciômetro desacelerou o ritmo, o capacitor perdeu sua carga, e as resistências menores aceleraram o ritmo. A medição do tempo de queda deu uma indicação da resistência do potenciômetro, que por sua vez possibilitou ao BASIC Stamp saber a posição do seletor do potenciômetro. Quando colocado em um circuito de queda RC, um fototransistor, que permite a passagem de mais ou menos corrente, quando mais ou menos luz brilha sobre ele, se comporta de maneira semelhante ao potenciômetro. Quando brilha mais luz sobre o fototransistor, ele conduz mais corrente, e o capacitor perde sua carga mais rapidamente. Com menos luz, o fototransistor permite a passagem de menos corrente e o capacitor perde sua carga mais devagar. Assim, a mesma medida RCTIME que nos deu uma indicação da posição da marcação com um potenciômetro no Capítulo 5, pode ser agora usada para medir os níveis de luz com um fototransistor. Nesta atividade, você vai construir e testar um circuito de queda RC que mede o tempo que leva para a carga do capacitor cair através de um fototransistor. A medição de queda RC vai lhe dar uma ideia dos níveis de luz detectados pela área de luz sentida pelo fototransistor. Tal como acontece com os testes do potenciômetro, os valores de tempo medidos pelo comando RCTIME serão exibidos no DEBUG Terminal. Peças para o Teste do Detector de Luz (1) Fototransistor (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (2) Capacitores – 0,01 µF (rotulado 103) (1) Capacitor – 0,1 µF (rotulado 104) (1) Fio Construindo o Circuito Tempo RC com um Fototransistor A Figura 7-4 mostra um diagrama esquemático e diagrama de fiação do circuito RCtime que você vai usar neste capítulo. Este circuito é diferente do circuito do potenciômetro do Capítulo 5, Atividade #3, de duas maneiras. Em primeiro lugar, o pino de I/O utilizado para medir o tempo de queda é diferente (P2). Em segundo lugar, o potenciômetro foi substituído por um fototransistor. Página - 164 Dica: Deixe o seu LED de 7 segmentos conectado, e adicione o circuito de fototransistor à sua placa. Nós vamos usar o LED de 7 segmentos com o fototransistor na Atividade #4. Construa o circuito mostrado na Figura 7-4. Certifique-se de que o coletor do fototransistor e os terminais emissores (C e E) estejam conectados conforme mostrado no diagrama de fiação. Vdd Vin Figura 7-4 Esquema e3 diagrama de fiação do circuito tempo RC com um fototransistor Vss X3 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Longer pin (C) terminal Comece com o capacitor de 0,01 µF, rotulado 103. Flat spot (E) terminal Programando o Teste do Fototransistor O primeiro programa de exemplo (TestPhototransistor.bs2) é realmente apenas uma versão ligeiramente revisada de ReadPotWithRcTime.bs2 do Capítulo 5, Atividade #3. O circuito do potenciômetro do Capítulo 5 foi ligado ao pino de I / O P7. O circuito nesta atividade está ligado a P2. Devido a essa diferença, o programa de exemplo tem que ter dois comandos atualizados para fazê-lo funcionar. O comando HIGH 7 do programa de exemplo anterior é agora HIGH 2, pois o circuito do fototransistor está ligado a P2 e não P7. Pela mesma razão, o comando RCTIME 7, 1, time foi alterado para RCTIME 2, 1, time. Exemplo de Programa: TestPhototransistor.bs2 O coletor de luz de superfície do fototransistor está na cúpula de plástico transparente, que é o terminal de base (B), mostrado na Figura 7-3. Um quadradinho preto deve ser visível através dessa cúpula. Esse quadrado preto é o fototransistor real, um pequeno pedaço de silício. O resto do dispositivo é a “embalagem”, incluindo caixa de plástico, quadro condutor e eletrodos. Em vez de girar o botão do potenciômetro, como fizemos no Capítulo 5, este circuito é testado através da exposição da superfície de coleta de luz do fototransistor a diferentes níveis de luz. Quando o programa de exemplo estiver sendo executado, o DEBUG Página - 165 Terminal deverá exibir valores pequenos para as condições de luz brilhante e grandes para condições de baixa luminosidade. Evite luz solar direta! O circuito e o programa que você está usando são projetados para detectar variações na iluminação interna e não trabalham na luz solar direta. Deixe as luzes internas ligadas, mas feche as cortinas, caso o sol esteja entrando através das janelas mais próximas. Coloque e execute o TestPhototransistor.bs2. Anote a variável time no DEBUG Terminal sob condições normais de iluminação. Lance uma sombra sobre o circuito com a sua mão e verifique a variável time novamente. Deve mostrar um número maior. Coloque a mão sobre o circuito para lançar uma sombra mais escura, o DEBUG Terminal deve exibir um valor significativamente maior para time. ' O que é um Microcontrolador - TestPhototransistor.bs2 ' Lê Fototransistor em circuito RC-time usando comando RCTIME. ' {$STAMP BS2} ' {$PBASIC 2.5} time PAUSE 1000 VAR Word DO HIGH 2 PAUSE 100 RCTIME 2, 1, time DEBUG HOME, "time = LOOP ", DEC5 time Sua Vez – Usando um Capacitor Diferente Para Diferentes Condições de Luminosidade As medições do tempo, com um capacitor de 0,1 μF, levarão dez vezes mais tempo do que aquelas feitas com um capacitor de 0,01 μF, o que significa que o valor da variável time exibido pelo DEBUG Terminal deverá ser dez vezes maior. Substituir o capacitor de 0,01 μF por um capacitor de 0,1 μF pode ser útil para salas mais iluminadas onde você costuma ver medidas menores com um capacitor de 0,01 μF. Por exemplo, vamos dizer que as condições de iluminação são muito brilhantes, e as medidas são de 1 a 13, com um capacitor de 0,01 μF. Se você substituí-lo por um capacitor de 0,1 μF, suas medidas, ao contrário, vão variar de 1 a 130, e sua aplicação será mais sensível às variações de luz dentro da sala. Modifique o circuito substituindo o capacitor de 0,01 μF, por um capacitor de 0,1 μF (rotulado 104). Reexecute o TestPhototransistor.bs2 e verifique se as medidas de RC-time são cerca de dez vezes seus valores anteriores. O intervalo de tempo mais longo que o comando RCTIME pode medir é de 65.535 unidades de 2 µs cada, o que corresponde a um tempo de queda de: 65535 × 2 µs = 131 Página - 166 ms = 0,131 segundos. Se o tempo de queda for superior a 0,131 segundos, o comando RCTIME retorna para 0, para indicar que o tempo máximo de medição foi excedido. Você pode lançar uma sombra bem escura sobre o fototransistor e ultrapassar a medida máxima 65535 e fazer o comando RCTIME voltar a 0? A próxima atividade contará com o menor dos dois capacitores. Antes de passar para a próxima atividade, retorne o circuito ao original como mostrado na Figura 7-4, remova o capacitor de 0,1 μF e substitua-o pelo capacitor de 0,01 μF. ATIVIDADE #2: RASTREANDO EVENTOS DE LUZ Uma das características mais úteis da memória do programa do módulo BASIC Stamp é que você pode desligar a alimentação da placa, sem perder o seu programa. Assim como a energia é restabelecida, o programa começa a correr a partir do início. Desde que o código para a sua aplicação não encha a memória do módulo BASIC Stamp, qualquer parte que não for usada para o programa poderá ser usada para armazenar dados. Esta memória é especialmente boa para o armazenamento de dados que você não deseja que o BASIC Stamp esqueça. Enquanto os valores armazenados por variáveis são apagados quando a energia é desligada, o BASIC Stamp ainda vai se lembrar de todos os valores armazenados em sua memória de programa quando o aparelho for religado. O que é um registro de dados? O registro de dados é o que um microcontrolador faz quando grava e armazena as medições periódicas do sensor por um determinado período de tempo. Dispositivos de registro de dados, ou dataloggers, são especialmente úteis em pesquisas científica. Por exemplo, em vez de enviar uma pessoa para um local distante para fazer as medições meteorológicas, pode ser implantada uma estação meteorológica de registro de dados, que registra as medições periódicas, e os cientistas visitam-na de vez em quando para coletar os dados, ou em alguns casos, eles transferem suas medições para um computador por telefone celular, rádio ou satélite. O chip do BASIC Stamp que armazena a memória do programa e os dados é mostrado na Figura 7-5. Este chip é chamado de EEPROM, que significa Electrically Erasable Programmable Read-Only Memory, (que é, basicamente, em tradução livre, uma memória que pode ser apagada várias vezes, eletricamente). Isso é um pouco complicado de se pronunciar, soletra-se cada uma das primeiras letras da palavra EEPROM. Quando as pessoas falam sobre uma EEPROM, elas costumam pronunciar: EE-Prom. Página - 167 2 KB da EEPROM armazena o código de fonte do seu PBASIC Figura 7-5 Chip EEPROM no Módulo BASIC Stamp Este EEPROM armazena seu código de programa e quaisquer outros dados que o programa coloca lá, mesmo quando a energia é desligada. Figura 7-6 mostra a janela do mapa de memória do BASIC Stamp Editor. Você pode visualizar esta janela clicando no BASIC Stamp Editor Run no menu e selecionar Memory Map. O Mapa de memória usa cores diferentes para mostrar como ambos os módulos do BASIC Stamp RAM (variáveis na memória de acesso aleatório) e EEPROM (memória de programa) estão sendo usados. O quadrado vermelho na barra de rolagem no canto esquerdo indica que parte da EEPROM é visível no mapa da EEPROM. Você pode clicar e arrastar esta área para cima e para baixo para ver as várias porções da memória EEPROM. Ao arrastar aquele quadrado vermelho até o fundo, você pode ver quanto espaço de memória EEPROM é usado por TestPhototransistor.bs2 de Atividade #1. Os bytes que contêm símbolos do programa são destacados em azul, e apenas 35 bytes fora dos 2048 bytes EEPROM são usados para o programa. Os restantes 2.013 bytes são livres para armazenar dados. Figura 7-6 Mapa da Memória Para visualizar esta janela, clique em “Run” (Executar), e selecione “Memory Map” (Mapa da Memória). O Mapa EEPROM mostra os endereços como valores hexadecimais, que foram discutidos brevemente na caixa “Decimal vs Hexadecimal” na página 150. Os valores ao longo do lado esquerdo mostram o endereço de partida de cada linha de bytes. Os números na parte superior mostram o número de bytes no interior dessa linha, de 0 a F em hexadecimal, que é de 0 a 15 em decimal. Por exemplo, na Figura 6-7, o valor hexadecimal C1 é armazenado no endereço 7E0. CC é armazenado no endereço 7E1, 6D é armazenado em 7E2, e assim por diante até E8, que é armazenado no endereço 7EF. Se você rolar para cima e para baixo com a barra de rolagem, você verá que os maiores endereços de memória estão na parte inferior do mapa da EEPROM e os endereços menores estão no topo, com a linha superior iniciando em 000. Página - 168 Os programas PBASIC são sempre armazenados em endereços maiores na EEPROM, mostrados na parte inferior do mapa da EEPROM. Assim, se o seu programa for armazenar dados na EEPROM, deve começar com os endereços menores, iniciando com o endereço 0. Isso ajuda a garantir que os dados armazenados não sobrescreverão o seu programa PBASIC, o que resultará em um acidente de programa. No caso do Mapa EEPROM mostrado na Figura 6-7, o programa PBASIC reside em endereços 7FF a 7DD, começando no endereço maior para a construção de endereços menores. Portanto, sua aplicação pode armazenar dados de endereços 000 a 7DC, construídos desde o menor até o maior. Em decimal os endereços são de 0 a 2012. Se você planeja armazenar dados na memória EEPROM, é importante que você faça a conversão de hexadecimal para decimal, a fim de calcular o maior endereço gravável. Abaixo segue o cálculo para converter o número 7DC hexadecimal para decimal. Hexadecimal é um sistema numérico com uma base de 16, o que significa que usa 16 dígitos diferentes para representar seus valores. Os dígitos 0 à 9 representam os primeiros 10 valores, e as letras A à F representam valores de 10 à 15. Ao converter a partir de hexadecimal para decimal, cada dígito da direita representa uma maior potência de dezesseis. O dígito mais à direita é o número de uns, que é o número de 160s. O dígito seguinte, a partir da direita, é o número de 16s, que é o número de 161s. O terceiro dígito é o número de 256s, que é o número de 162s. Hexadecimal 7DC = = = = = (7 × 162) + (D × 161) + (C × 160) (7 × 162) + (13 × 161) + (12 × 160) (7 × 256) + (13 × 16) + (12 × 1) 1792 + 208 + 12 2012 (valor decimal) Esta abordagem de conversão funciona da mesma forma em outras bases, incluindo a base de 10 valores decimais. Por exemplo: 2102 = (2 × 103) + (1 × 102) + (0 × 101) + (2 × 100) = (2 × 1000) + (1 × 100) + (0 × 10) + (2 × 1) 2048 bytes = 2 KB. Embora tanto a maiúscula quanto a minúscula “K” sejam chamadas "quilo", elas são ligeiramente diferentes. Em eletrônica e computação, a maiúscula K é usada para indicar um kilobyte binário, que é 1 × 210 = 1024. Ao se referir a exatamente 1.000 bytes, use a minúscula k, que significa quilo e é 1 x 103 = 1000 no sistema métrico. Além disso, a maiúscula "B" 'significa bytes, enquanto a minúscula "b" significa bits. Isso pode fazer uma grande diferença porque significa 2 Kb 2048 bits, que são 2048 números diferentes, mas cada número é limitado a um valor de 0 ou 1. Em contraste, 2 KB são 2048 bytes, em cada um pode ser armazenado um valor na gama de 0 a 255. Usar o EEPROM para o armazenamento de dados pode ser muito útil para aplicações remotas. Um exemplo de uma aplicação remota seria um monitor de temperatura colocado num veículo que transporta alimentos congelados. Ele controlaria a temperatura durante toda a viagem verificando se ela se manteve fria o suficiente e que Página - 169 nada no desembarque estava descongelado. Um segundo exemplo é uma estação meteorológica. Uma das peças de registro de dados de uma estação meteorológica que pode ser armazenada para posterior recuperação é a dos níveis de luz. Isso pode dar uma indicação da nebulosidade em momentos do dia, alguns estudos usam para monitorar os efeitos da poluição e de trilhas de condensação de rastros de avião (com trilhas) em níveis de luz que atingem a superfície da Terra. Com o acompanhamento do nível de luz na mente, esta atividade apresenta uma técnica para armazenar os níveis de iluminação medidos para a EEPROM e depois recuperá-los novamente. Nesta atividade, você vai executar um exemplo de programa PBASIC que armazena uma série de medições de luz na EEPROM do módulo BASIC Stamp. Depois que o programa estiver concluído, você vai correr um segundo programa que recupera os valores da EEPROM e os exibe no DEBUG Terminal. Programando o Armazenamento de Dados a Longo Prazo O comando WRITE é utilizado para armazenar valores na EEPROM, e o comando READ é utilizado para obter esses valores. A sintaxe do comando é: WRITE Location, {WORD} Value Por exemplo, se você quer escrever o valor de 195 para endereçar 7 na EEPROM, você pode usar o comando: WRITE 7, 195 Os valores de WORD podem estar entre 0 e 65565, enquanto os valores de byte podem conter apenas os números de 0 a 255. O valor da palavra ocupa o espaço de dois bytes. Se você quiser escrever o tamanho do valor da palavra na EEPROM, você tem que usar o modificador WORD opcional. Porém, tenha cuidado: Uma vez que a palavra ocupa dois bytes, você tem que pular um dos endereços do tamanho dos bytes da EEPROM antes de escrever outra palavra. Vamos dizer que você precisa para salvar dois valores de palavra para EEPROM: 659 e 50012. Se você deseja armazenar o primeiro valor no endereço 8, você terá que escrever o segundo valor para o endereço 10. WRITE 8, Word 659 WRITE 10, Word 50012 Página - 170 É possível escrever sobre o seu programa? Sim, e se você fizer isso, é provável que o programa comece a se comportar de modo estranho ou pare de funcionar completamente. Uma vez que os sinais do programa PBASIC residem nos maiores endereços da EEPROM, é melhor usar os menores valores de Location para armazenar números com o comando WRITE. Como eu sei se o Location que estou usando é muito grande? Você pode usar o mapa de memória para descobrir o maior valor não utilizado pelo seu programa PBASIC. A explicação após a Figura 7-6 na página 168 descreve como calcular quantos endereços de memória estão disponíveis. Como um atalho para converter hexadecimal para decimal, você pode usar o formatador DEC e o formatador $ hexadecimal do comando DEBUG assim: DEBUG DEC $7DC O programa vai exibir o valor decimal de 7DC hexadecimais porque o formatador $ hexadecimal diz ao comando DEBUG que 7DC é um número hexadecimal. Então, o formatador DEC faz com que o comando DEBUG exiba esse valor em formato decimal. Exemplo de Programa: StoreLightMeasurementsInEeprom.bs2 Este programa de exemplo demonstra como usar o comando WRITE, tomando medições de luz cada 5 segundos por 2 minutos e meio e as armazenando na EEPROM. Como exemplo de programa da atividade anterior, ele exibe as medições no DEBUG Terminal, mas também armazena cada medição na EEPROM para posterior recuperação por um programa diferente, que usa o comando READ. Coloque e execute StoreLightMeasurementsInEeprom.bs2. Registre os valores apresentados pelo DEBUG Terminal para que você possa verificar as medições e relê-las na EEPROM. Aumente gradualmente a sombra sobre o fototransistor durante o período de teste de 2 ½ minutos para dados significativos. Especialmente se você tem uma placa USB, ligá-la ao computador poderia restabelecer o BASIC Stamp e reiniciar o programa, neste caso, ele começaria a tomar um novo conjunto de medições. Após o término de StoreLightMeasurementsInEeprom.bs2, desconecte a alimentação de sua placa imediatamente e deixe-a desligada até que você esteja pronto para executar o próximo programa de exemplo: ReadLightMeasurementsFromEeprom.bs2. Você pode alterar as pausas no loop FOR...NEXT. Este exemplo de programa tem cinco segundos de pausa, que enfatizam as medições periódicas que os dispositivos de registro de dados tem. Eles podem parecer meio longos, por isso, você pode reduzir o PAUSE 5000 para PAUSE 500 para fazer o programa executar dez vezes o teste mais rápido. Página - 171 ' O que é um Microcontrolador - StoreLightMeasurementsInEeprom.bs2 ' Escreve medições de luz para EEPROM. ' {$STAMP BS2} ' {$PBASIC 2.5} time eepromAddress VAR VAR Word Byte PAUSE 1000 DEBUG "Iniciando medições...", CR, CR "Valor da medição", CR, "---------------", CR FOR eepromAddress = 0 TO 58 STEP 2 HIGH 2 PAUSE 5000 RCTIME 2, 1, time DEBUG DEC2 eepromAddress, " ", DEC time, CR WRITE eepromAddress, Word time NEXT DEBUG "Pronto. Agora, execute:", CR, "ReadLightMeasurementsFromEeprom.bs2" END Como Funciona StoreLightMeasurementsInEeprom.bs2 O loop FOR...NEXT que mede os valores de RC-time e os armazena na EEPROM tem que contar em intervalos de 2, porque os valores da palavra estão escritos na EEPROM. FOR eepromAddress = 0 to 58 STEP 2 O comando RCTIME carrega a medição do tempo de queda para o tamanho da palavra na variável time. RCTIME 2, 1, time O valor que a variável time armazena é copiado para o endereço na EEPROM obtido pelo valor atual da variável eepromAddress cada vez através do loop. Lembre-se de que o endereço de um comando WRITE é sempre em termos de bytes. Assim, a variável eepromAddress é incrementada por dois de cada vez através do loop, porque uma variável Word ocupa dois bytes. WRITE eepromAddress, Word time NEXT Programando a Recuperação de Dados Para recuperar os valores que você acabou de gravar a partir da EEPROM, você pode usar o comando READ. A sintaxe para o comando READ é: READ Location, {WORD} Variable Enquanto o comando WRITE pode copiar tanto um valor de uma constante ou de uma variável para a EEPROM, o comando READ tem que copiar o valor armazenado no Página - 172 endereço da EEPROM para a variável, assim como o próprio nome sugere, o argumento variável deve ser uma variável. Tenha em mente que as variáveis são armazenadas na memória RAM do módulo BASIC Stamp. Ao contrário da EEPROM, os valores de RAM são apagados sempre que a alimentação for desligada e também sempre que o botão Reset na sua placa for pressionado. O BASIC Stamp 2 tem 26 bytes de RAM, mostrados no lado direito do mapa de memória na Figura 7-6 na página 167. Se você declarar uma variável Word, você está usando dois bytes. A declaração da variável byte usa um byte, um nibble usa metade de um byte, e um bit utiliza 1/8 de um byte. Digamos que eepromValueA e eepromValueB são variáveis de Word e littleEE é uma variável Byte. Estas variáveis têm de ser definidas no início do programa com declarações de variáveis VAR. Aqui estão alguns comandos para recuperar os valores que foram armazenados anteriormente em determinados endereços EEPROM com comandos WRITE, talvez até mesmo em um programa diferente. READ 7, littleEE READ 8, Word eepromValueA READ 10, Word eepromValueB O primeiro comando recupera um valor byte do endereço EEPROM 7 e copia para a variável denominado littleEE. O próximo comando copia a palavra ocupando EEPROM byte endereços 8 e 9 e as armazena em eepromValueA da variável word. O último dos três comandos copia a palavra ocupando EEPROM byte endereços 10 e 11 e as armazena na variável eepromValueB. Exemplo de Programa: ReadLightMeasurementsFromEeprom.bs2 Este programa de exemplo demonstra como utilizar o comando READ para recuperar as medições de luz que foram armazenadas na EEPROM por StoreLightMeasurementsInEeprom.bs2. Reconecte a energia de sua placa. Coloque ReadLightMeasurementsFromEeprom.bs2 no BASIC Stamp Editor. Se você tiver desligado a energia de sua placa, quando a reconectar, clique imediatamente no botão Run do BASIC Stamp Editor para baixar o programa para o BASIC Stamp. Não espere mais de 6 segundos entre reconectar a energia e carregar ReadLightMeasurementsFromEeprom.bs2 no BASIC Stamp ou o programa que ainda está na memória de programa (StoreLightMeasurementsInEeprom.bs2) vai começar a gravar sobre as medições anteriores. Além disso, se você reduziu Duration do comando PAUSE 5000 para 500, você terá apenas 1,5 segundo! Compare a tabela do DEBUG Terminal apresentada neste programa, com a exibida no StoreLightMeasurementsInEeprom.bs2, e verifique se os valores são os mesmos. Página - 173 ' O que é um Microcontrolador - ReadLightMeasurementsFromEeprom.bs2 ' Lê as medições de luz da EEPROM. ' {$STAMP BS2} ' {$PBASIC 2.5} time eepromAddress VAR VAR Word Byte PAUSE 1000 DEBUG "Recuperando as medições", CR, CR, "Valor da medição", CR, "--------------", CR FOR eepromAddress = 0 TO 58 STEP 2 READ eepromAddress, Word time DEBUG DEC2 eepromAddress, " ", DEC time, CR NEXT END Como Funciona o ReadLightMeasurementsFromEeprom.bs2 Tal como acontece com o comando WRITE, o comando READ conta com endereços de byte. Se nós quisermos ler os valores da palavra da EEPROM, a variável eepromAddress tem que ter dois adicionado a ela cada vez através do loop FOR...NEXT. FOR eepromAddress = 0 to 58 STEP 2 O comando READ recebe o valor do tamanho da palavra em eepromAddress, que é copiado para a variável time. READ eepromAddress, Word time Os valores do tempo e as variáveis eepromAddress são exibidas em colunas adjacentes, como uma tabela no DEBUG Terminal. DEBUG DEC2 eepromAddress, " NEXT ", DEC time, CR Sua Vez – Mais Medições Modifique StoreLightMeasurementsInEeprom.bs2 para que ele leve e registre o dobro de medições na mesma quantidade de tempo. Modifique ReadLightMeasurementsFromEeprom.bs2 para que exiba todas as medições já modificadas do StoreLightMeasurementsInEeprom.bs2. ATIVIDADE #3: MEDIÇÕES GRÁFICAS DE LUZ (OPCIONAL) Listas de medições como as da Atividade #2 podem ser tediosas de analisar. Imagine ler centenas de números sem interrupção até o sol se por. Ou talvez você esteja olhando Página - 174 para um evento especial, como quando o sensor de luz foi brevemente coberto. Você pode até estar a olhar para um padrão na forma como muitas vezes o sensor de luz foi coberto. Esta informação pode ser útil se o sensor de luz for colocado em uma área onde uma pessoa ou animal caminhar sobre ela, ou um objeto que passar por cima de uma correia transportadora precisar ser registrado e analisado. Independentemente da aplicação, se tudo que você tem para trabalhar é uma longa lista de números, encontrar esses eventos e padrões podem ser uma tarefa difícil e demorada. Se você fizer um gráfico da lista de medições será muito mais fácil encontrar eventos e padrões. A pessoa, animal ou objeto que passar sobre o sensor de luz vai aparecer como um ponto alto ou pico nas medições. A Figura 7-7 mostra um exemplo de um gráfico que indica a taxa quando os objetos sobre uma correia transportadora estão passando sobre o sensor. Os picos no gráfico ocorrem quando as medições forem grandes. No caso de uma correia transportadora, indicaria que um objeto passou sobre o sensor lançando uma sombra. Este gráfico facilita com um olhar de relance ver que um objeto passa sobre o sensor aproximadamente a cada 7 segundos, mas que o objeto esperado em 28 segundos não estava lá. Figura 7-7: Gráfico de medições de luz do fototransistor Decay Time Vs. Time for Phototransistor RC Circuit 9000 8000 Decay Time (2 us) 7000 6000 5000 4000 3000 2000 1000 0 0 "Decay Time" 10 20 30 40 50 60 Tim e (s) O gráfico da figura 7-7 foi gerado copiando e colando valores no DEBUG Terminal para um arquivo de texto que foi, em seguida, importado para uma planilha do Microsoft Excel. Alguns utilitários gráficos podem tomar o lugar do DEBUG Terminal e traçar os valores diretamente, em vez de exibi-los como listas de números. A Figura 78 mostra um exemplo de um desses utilitários, chamado StampPlot LITE. Página - 175 Figura 7-8: StampPlot LITE Nesta atividade opcional, você pode ir para www.parallax.com/go/WAM e seguir o link “Dados de Plotagem” (Data Plotting) para tentar uma série de atividades que demonstram como plotar valores utilizando várias planilhas e gráficos de pacotes de software de utilitários. ATIVIDADE #4: SIMPLES MEDIDOR DE LUZ As informações do sensor de luz podem ser transmitidas de várias formas. O medidor de luz que você vai trabalhar nessa atividade altera a taxa das cintilações dependendo da intensidade de luz que ele detecta. Peças do Medidor de Luz (1) Fototransistor (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (2) Capacitores – 0,01 μF (rotulado 103) (1) Capacitor – 0,1 μF (rotulado 104) (1) Display de LED de 7 segmentos (8) Resistores – 1 kΩ (marrom-preto-vermelho) (6) Fios Construindo o Circuito do Medidor de Luz Figura 7-9 mostra o display de LED de 7 segmentos e esquemas de circuitos do fototransistor que serão utilizados para fazer o medidor de luz, e a Figura 7-10 mostra o diagrama de fiação dos circuitos. O circuito do fototransistor é o mesmo que você usou nas duas últimas atividades, e o circuito do display do LED de 7 segmentos é o mesmo da Figura 6-11 na página 145. Construa o circuito mostrado na Figura 7-9 e na Figura7-10. Página - 176 Teste o display de LED de 7 segmentos para ter certeza de que está conectado corretamente, usando o programa SegmentTestWithHighLow.bs2 do Capítulo 6, Atividade #2, que começa na página 144. Figura 7-9 Esma do circuito do medidor de luz Figura 7-10 Diagrama de fiação para a Figura 7-9 Utilizando Sub-rotinas A maioria dos programas que você escreveu até agora operam dentro de um DO...LOOP. Uma vez que a atividade principal de todo o programa acontece dentro do DO...LOOP, ela é normalmente chamada de rotina principal. À medida que você adicionar mais circuitos e funções mais úteis ao seu programa, poderá ficar um pouco difícil manter o controle de todo o código na rotina principal. Seus programas serão muito mais fáceis de trabalhar se você em vez organizá-los em pequenos segmentos de código para fazer determinados trabalhos. O PBASIC tem alguns comandos que você pode usar para fazer o programa saltar para fora da rotina principal, fazer um trabalho e, em seguida, retornar para o mesmo local na rotina principal. Isto irá permitir que você mantenha cada segmento de código que faz um trabalho específico em algum lugar diferente da rotina principal. Cada vez que você precisar do programa para fazer um Página - 177 desses trabalhos, você pode escrever um comando dentro da rotina principal que diz ao programa para saltar para esse trabalho, fazê-lo, e voltar quando o trabalho estiver feito. Os trabalhos são chamados de sub-rotinas e este processo está chamando uma subrotina. A Figura 7-11 mostra um exemplo de uma sub-rotina e como ela é usada. O comando GOSUB Subroutine_Name faz com que o programa salte para a Subroutine_Name: label. Quando o programa chega a esse rótulo, ele continua correndo e executa comandos até chegar a um comando RETURN. Então, o programa volta ao comando que vem após o comando GOSUB. No caso do exemplo mostrado na Figura 7-11, o próximo comando é: DEBUG "Next command”. DO GOSUB Subroutine_Name DEBUG "Next command" LOOP Subroutine_Name: Figura 7-11 Como as sub-rotinas trabalham DEBUG "This is a subroutine..." PAUSE 3000 RETURN O que é um label? Label é um nome que pode ser usado como um espaço reservado em seu programa. GOSUB é um dos comandos que você pode usar para saltar para um label. Alguns outros são GOTO, ON GOTO, e ON GOSUB. O label deve terminar com dois pontos, e por uma questão de estilo, palavras separadas terão o caractere sublinhado para ficar mais fácil de reconhecer. Ao escolher um nome para um label, certifique-se de não usar uma palavra reservada ou um nome que já está sendo usado em uma variável ou constante. O resto das regras para o nome do label são os mesmos que os nomes das variáveis, que estão listadas na caixa de informações na página 36. Exemplo de Programa: SimpleSubroutines.bs2 Este programa de exemplo mostra como sub-rotinas operam enviando mensagens para o DEBUG Terminal. Examine SimpleSubroutines.bs2 e tente adivinhar a ordem em que os comandos DEBUG serão executados. Coloque e execute o programa. Compare o comportamento atual de seu programa com suas previsões. ' O que é um Microcontrolador - SimpleSubroutines.bs2 ' Demonstra como sub-rotinas funcionam. ' {$STAMP BS2} ' {$PBASIC 2.5} PAUSE 1000 DO Página - 178 DEBUG PAUSE GOSUB DEBUG PAUSE GOSUB DEBUG PAUSE CLS, "Inicia rotina principal.", CR 2000 First_Subroutine "Retorna à principal.", CR 2000 Second_Subroutine "Repete principal...", CR 2000 LOOP First_Subroutine: DEBUG " Executando primeira " DEBUG "sub-rotina.", CR PAUSE 3000 RETURN Second_Subroutine: DEBUG " Executando segunda " DEBUG "sub-rotina.", CR PAUSE 3000 RETURN Como Funciona SimpleSubroutines.bs2 A Figura 7-12 mostra como a chamada First_Subroutine na rotina principal (DO...LOOP) funciona. O comando GOSUB First_Subroutine envia o programa para a First_Subroutine: label. Em seguida, os três comandos dentro dessa subrotina são executados. Quando o programa chega ao comando RETURN, ele pula de volta para o comando que vem logo após GOSUB First_subroutine, que é DEBUG "Retorna à principal", CR. O que é uma chamada de sub-rotina? Quando você usa o comando GOSUB para fazer o programa saltar para uma sub-rotina, isso é chamado de chamada de sub-rotina. PAUSE 2000 GOSUB First_Subroutine DEBUG "Back in main.", CR First_Subroutine: DEBUG " Executing first " DEBUG "subroutine.", CR PAUSE 3000 RETURN Figura 7-12 Primeira Chamada de Sub-rotina Página - 179 A Figura 7-13 mostra um segundo exemplo do mesmo processo com a chamada da segunda sub-rotina (GOSUB Second_Subroutine). PAUSE 2000 GOSUB Second_Subroutine DEBUG "Repeat main...", CR Second_Subroutine: DEBUG " Executing second " Figura 7-13 Chamada de Segunda Sub-rotina DEBUG "subroutine", CR PAUSE 3000 RETURN Sua Vez – Adicionando Identando Sub-Rotinas Você pode adicionar sub-rotinas após as duas que estão no programa e chamá-las de dentro da rotina principal. Adicione a sub-rotina mostrada na Figura 7-11, na página 177 à SimpleSubroutines.bs2. Faça os ajustes necessários aos comandos DEBUG, de modo que o visor pareça correto com todas as três sub-rotinas. Você também pode chamar uma sub-rotina de dentro de outra. Isso é chamado de identamento de sub-rotinas. Tente mover o comando GOSUB que chama SUBROUTINE_NAME em uma das outras sub-rotinas, e ver como ele funciona. Ao identar as sub-rotinas, a regra é: não mais do que quatro. Consulte o Manual de BASIC Stamp ou Ajuda do BASIC Stamp Editor para mais informações. Localize GOSUB e RETURN. Medidor de Luz Utilizando Sub-rotinas O programa seguinte, LightMeter.bs2, utiliza rotinas para controlar o display de LED de 7 segmentos de acordo com o nível de luz detectada pelo fototransistor. O ciclo do display dos segmentos on e off em um padrão circular, fica mais rápido quando a luz no fototransistor fica mais brilhante. Quando a luz fica mais fraca, o padrão circular vai mais devagar. O exemplo de programa LightMeter.bs2 utiliza uma sub-rotina denominada Update_Display para controlar a ordem em que os segmentos do medidor de luz avançam. O programa que executa o medidor de luz vai lidar com três operações diferentes: 1. Ler o Fototransistor. 2. Calcular o tempo de espera antes de atualizar o display de LED de 7 segmentos. 3. Atualizar o display de LED de 7 segmentos. Página - 180 Cada operação está contida dentro de sua própria sub-rotina, e a rotina principal DO...LOOP chamará cada uma em sequência, repetidamente. Exemplo de Programa: LightMeter.bs2 Condições controladas de iluminação fazem uma grande diferença! Para melhores resultados, realize este teste em uma sala iluminada por lâmpadas fluorescentes com pouca, ou nenhuma, luz solar direta (feche as cortinas). Para obter informações sobre como calibrar este medidor para outras condições de iluminação, consulte a seção “Sua Vez”. Coloque e execute LightMeter.bs2. Verifique se a velocidade do ciclo do teste padrão circular exibido pelo LED de 7 segmentos é controlada pelas condições de iluminação que o fototransistor está percebendo. Para fazer isso, projete uma sombra sobre ele com a mão ou um pedaço de papel e verifique se a taxa de exibição do padrão circular desacelera. ' O que é um Microcontrolador - LightMeter.bs2 ' Indica nível de luz usando display de LED de 7 segmentos. ' {$STAMP BS2} ' {$PBASIC 2.5} PAUSE 1000 DEBUG "Programa funcionando!" index time VAR VAR Nib Word ' Declaração de variáveis. OUTH = %00000000 DIRH = %11111111 ' Inicializa display de 7 segmentos. DO ' Rotina principal. GOSUB Get_Rc_Time GOSUB Delay GOSUB Update_Display LOOP Get_Rc_Time: ' Sub-rotinas ' Sub-rotina RC-time HIGH 2 PAUSE 3 RCTIME 2, 1, time RETURN Delay: ' Sub-rotina de espera PAUSE time / 3 RETURN Update_Display: ' Sub-rotina de atualização do display Página - 181 IF index = 6 THEN index = 0 ' BAFG.CDE LOOKUP index, [ %01000000, %10000000, %00000100, %00000010, %00000001, %00100000 ], OUTH index = index + 1 RETURN Como Funciona LightMeter.bs2 As duas primeiras linhas do programa declararam variáveis. Não importa se essas variáveis são utilizadas em sub-rotinas ou na rotina principal, é sempre melhor declarar variáveis (e constantes) no início de seu programa. Uma vez que esta é uma prática bastante comum, esta seção de código tem um nome, "Declarações de variáveis". Este nome é mostrado no comentário à direita da primeira declaração de variável. index VAR Nib time VAR Word ' Declaração de variáveis. Muitos programas também têm coisas que precisam ser feitas uma vez no início do programa. Definir todos os pinos de I/O de 7 segmentos como baixos e, em seguida, torna-los saídas é um exemplo. Esta seção de um programa PBASIC também tem um nome, "Inicialização" OUTH = %00000000 DIRH = %11111111 ' Inicializa display de 7 segmentos O próximo segmento de código é chamado de rotina principal. A rotina principal chama primeiro a sub-rotina Get_Rc_Time. Em seguida, ela chama a sub-rotina Delay e, depois disso, ela chama a sub-rotina Update_Display. Lembre-se que o programa passa por três sub-rotinas tão rápido quanto possível, repetidamente. DO GOSUB Delay GOSUB Update_Display LOOP ' Rotina principal Todas as sub-rotinas são, normalmente, colocadas após a rotina principal. O nome da primeira sub-rotina é Get_Rc_Time: e assume as medidas de RC-time do circuito do fototransistor. Esta sub-rotina tem um comando PAUSE que carrega o capacitor. A duração deste comando é pequena, porque ele só precisa fazer uma pausa longa o suficiente para garantir que o capacitor esteja carregado. Note-se que o comando RCTIME define o valor da variável time. Esta variável vai ser utilizada na segunda subrotina. Get_Rc_Time: HIGH 2 ' Sub-rotinas ' Sub-rotina RC-time Página - 182 PAUSE 3 RCTIME 2, 1, time RETURN O segundo nome da sub-rotina é Delay, e tudo que ela contém é PAUSE time / 3. O comando PAUSE permite que o tempo de queda medido (quão brilhante é a luz) controle o atraso ao ligar cada segmento de luz no mostrador giratório circular do LED de 7 segmentos. O valor a direita do operador de divisão / pode ser feito maior para uma rotação mais rápida, em condições inferiores de luz, ou menor para retardar a exibição das condições de luz mais brilhantes. Você também pode usar * para multiplicar a variável time por um valor, em vez de dividir para fazer a exibição ficar muito mais lenta, e para um controle mais preciso sobre a taxa, não se esqueça dos operadores */. Mais informações sobre este operador na seção “Sua Vez”. Delay: PAUSE time / 3 RETURN A terceira sub-rotina é chamada Update_Display. O comando LOOKUP nesta subrotina contém uma tabela com seis padrões de bits que são usados para criar o padrão circular em torno do exterior do visor do LED de 7 segmentos. Ao adicionar 1 a variável index cada vez que a sub-rotina é chamada, ele faz com que o padrão de bits na próxima sequência seja colocado na OUTH. Existem apenas seis entradas na tabela LOOKUP para os valores index de 0 a 5. O que acontece quando o valor do índice recebe 6? O comando PROC não sabe voltar automaticamente para a primeira entrada, mas você pode usar uma instrução IF...THEN para corrigir esse problema. O comando IF index = 6 THEN index = 0 redefine o valor do índice de 0 a cada vez que recebe 6. Ele também faz com que a sequência de padrões de bits colocados em OUTH repita alternadamente. Este, por sua vez, faz com que o LED de 7 segmentos repita seu padrão circular uma e outra vez. Update_Display: IF index = 6 THEN index = 0 ' BAFG.CDE LOOKUP index, [ %01000000, %10000000, %00000100, %00000010, %00000001, %00100000 ], OUTH index = index + 1 RETURN Sua Vez – Ajuste do Hardware e Software do Medidor Há duas maneiras de alterar a sensibilidade do medidor. Primeiro, o "software", que é o programa PBASIC, pode ser alterado para ajustar a velocidade. Como mencionado anteriormente, dividindo a variável tempo na sub-rotina Delay comando PAUSE time / 3 por números maiores que 3 vai acelerar a exibição, e os números menores vão retardá- Página - 183 la. Para realmente retardá-la, o tempo também pode ser multiplicado por valores com o operador de multiplicação *, e para ajustá-los há o operador */. Ao conectar os capacitores em paralelo, seus valores se somam. Então, se você conectar um segundo capacitor de 0,01 μF ao lado do primeiro, como mostrado na Figura 7-14 e na Figura 7-15, a capacitância será 0,02 μF. Com o dobro da capacidade, a queda de medição para o mesmo nível de luz vai demorar o dobro do tempo. Ligue o segundo capacitor de 0,01 μF ao lado do primeiro na parte do sensor de luz do circuito medidor de luz na Figura 7-14 e Figura 7- 15. Execute LightMeter.bs2 e observe o resultado. Se as medições do tempo forem duas vezes maior, o teste padrão circular do LED de 7 segmentos deverá girar a metade da velocidade. Figura 7-14 Dois capacitores de 0,01 μF em paralelo = 0,02 μF Figura 7-15 Circuitos de medidor de luz com dois capacitores de 0,01 μF em paralelo Em vez de metade da velocidade de um capacitor de 0,01 μF, que tal um com um décimo da velocidade? Você pode fazer isso através da substituição dos dois capacitores de 0,01 μF por um capacitor de 0,1 μF. Ele vai trabalhar bem em salas iluminadas, mas provavelmente vai ser um pouco lento para a iluminação normal. Lembre-se que quando você usa um capacitor que é dez vezes maior, a medição RC-time vai demorar dez vezes mais tempo. Substitua os capacitores de 0,01 μF capacitores por um capacitor de 0,1 μF. Execute o programa e veja se ocorreu o efeito previsto. Antes de continuar, restaure o circuito para um capacitor de 0,01 em paralelo com o fototransistor como mostrado na Figura 7-9 e Figura 7-10, começando na página 176. Antes de continuar, teste seu circuito restaurado para verificar se ele funciona. Página - 184 O que é melhor, ajustar o software ou o hardware? Você deve sempre tentar usar o melhor dos dois mundos. Escolha um capacitor que lhe de as medições mais precisas sobre a ampla gama de níveis de luz. Uma vez que seu hardware é o melhor que pode ser, use o software para ajustar automaticamente o medidor de luz para que ele funcione bem para o usuário sob as mais diversas condições. Isso leva uma quantidade considerável de testes e refinamento, mas isso é tudo parte do processo de elaboração do produto. ATIVIDADE #5: SAÍDAS ON/OFF DO FOTOTRANSISTOR Antes dos microcontroladores se tornarem comuns nos produtos, os fotoresistores foram usados em circuitos que variavam em sua saída de tensão. Quando a tensão ficou aquém do limite, indicando o anoitecer, outros circuitos no aparelho acenderam as luzes. Quando a tensão ultrapassou o limite, indicando o dia, os outros circuitos no aparelho apagaram as luzes. Este comportamento do interruptor de binário de luz pode ser emulado com o mesmo BASIC Stamp e circuito de queda do RC, basta modificar o programa PBASIC. Alternativamente, o circuito pode ser modificado para que ele envie um 1 ou 0 para um pino de I/O de acordo com a quantidade de tensão fornecida ao pino, semelhante à maneira como um botão de pressão faz. Nesta atividade, você vai tentar essas duas abordagens. Ajustando o Programa para Situações On / Off O PhototransistorAnalogToBinary.bs2 pega a gama de medida do fototransistor e compara-a ao ponto a meio caminho entre as medidas maiores e menores. Se a medida estiver acima do ponto a meio caminho, ele exibe "Acenda a luz”; caso contrário, ele exibe “Apague a luz”. O programa usa diretivas constantes para definir as maiores e as menores medidas que o programa deve esperar do circuito do fototransistor. valMax valMin CON CON 4000 100 O programa também utiliza operadores MIN e MAX para garantir que os valores fiquem dentro desses limites antes de usá-los para tomar qualquer decisão. Se o tempo é maior do que valMax (4000 no programa de exemplo), a instrução define o tempo para valMax = 4000. Da mesma forma, se o tempo é menor do que valMin (100 no programa de exemplo), a instrução define o tempo para valMin = 100. time = time MAX valMax MIN valMin Uma declaração IF...THEN...ELSE converte o intervalo de valores analógicos digitalizados em uma saída binária que assume a forma de mensagens de luz acesa ou luz apagada. IF time > (valMax - valMin) / 2 THEN DEBUG CR, "Acenda a luz " ELSE DEBUG CR, "Apague a luz" ENDIF Página - 185 Para que este programa funcione corretamente, antes você tem que calibrar as condições de iluminação da seguinte forma: Verifique se o circuito do fototransistor para se certificar de que tem apenas um capacitor 0,01 μF (rotulado 103). Coloque o PhototransistorAnalogToBinary.bs2 no BASIC Stamp Editor. Certifique-se de adicionar um espaço extra após o "z" na mensagem "Acenda a luz ". Caso contrário, você vai ter um "z" fantasma da mensagem "Apague a luz", que tem um caractere a mais nela. Carregue o programa para o BASIC Stamp. Assista ao DEBUG Terminal quando você aplicar as condições de iluminação mais escuras e mais brilhantes que você deseja testar, e faça anotações dos valores de tempo mínimos e máximos resultantes. Coloque esses valores em valMax e valMin na diretivas COM do programa. Agora, seu programa está pronto para ser executados e testado. Carregue o programa modificado para o BASIC Stamp. Teste para verificar se as condições de iluminação fraca resultarão na mensagem “Acenda a luz” e as condições de iluminação brilhante resultarão na mensagem "Apague a luz". ' O que é um Microcontrolador - PhototransistorAnalogToBinary.bs2 ' Mude a medida analógica digitalizada do Fototransistor para um ' resultado binário. ' {$STAMP BS2} ' {$PBASIC 2.5} valMax valMin CON CON 4000 100 time VAR Word PAUSE 1000 DO HIGH 2 PAUSE 100 RCTIME 2, 1, time time = time MAX valMax MIN valMin DEBUG HOME, "time = ", DEC5 time IF time > (valMax - valMin) / 2 THEN DEBUG CR, "Acenda a luz " ELSE DEBUG CR, "Apague a luz" ENDIF Página - 186 LOOP Sua Vez – Diferentes Limites para Claro e Escuro Se você tentar incorporar o PhototransistorAnalogToBinary.bs2 em um sistema automático de iluminação, ele terá um defeito potencial. Vamos dizer que está bastante escuro lá fora para fazer a medição do tempo ficar aquém (valMax - valMin) / 2, assim as luzes acendem. Mas se o sensor detectar luz, faria a medição ficar abaixo (valMax - valMin) / 2, então a luz desligaria novamente. Este ciclo lightson/lights-off poderia se repetir rapidamente a noite toda! A Figura 7-16 mostra como isso poderia funcionar em um gráfico. À medida que o nível de luz cai, o valor das variáveis de tempo aumenta, e quando ultrapassa o limite, as luzes automáticas acedem. Uma vez que o fototransistor detectar a luz que acabou de acender, a medição da variável tempo cai para abaixo do limite, assim que as luzes apagarem. Em seguida, o valor da variável tempo aumenta novamente, e ultrapassa o limite, então as luzes acendem e a variável de tempo cai abaixo do limite novamente, e assim por diante... valMax "Turn light on " Figura 7-16 Oscilações acima/abaixo do limite (valMax - valMin) / 2 "Turn light off" valMin Uma solução para este problema consiste em adicionar uma segunda entrada, tal como ilustrado na Figura 7-17. A entrada “Acenda a luz” só acende a luz depois que ficou muito escuro, e a entrada “Apague a luz” só reacende a luz depois que ficou muito claro. Com este sistema, a luz acende depois que alcançasse a área “Acenda a luz”. A luz acesa tornou mais clara, assim o tempo caiu um pouco, mas desde que não caiu para baixo após a entrada “Apague a luz”, nada mudou, e a luz ficará acesa como deveria. O termo histerese é utilizado para descrever este tipo de sistema, que tem dois limites de entradas diferentes que afetam a sua saída juntamente com uma zona de transição entre elas. valMax "Turn light on " (valMax - valMin) / 4 * 3 No transition (valMax - valMin) / 4 Figura 7-17 Usando diferentes limites de alta e baixa para evitar oscilações "Turn light off" valMin Você pode implementar este sistema de duas entradas em seu código PBASIC modificando a declaração IF...THEN...ELSEIF PhotransistorAnalogToBinary.bs2 's. Aqui está um exemplo: Página - 187 IF time > (valMax - valMin) / 4 * 3 THEN DEBUG CR, "Acenda a luz " ELSEIF time < (valMax - valMin ) / 4 THEN DEBUG CR, "Apague a luz" ENDIF O primeiro bloco de código IF...THEN exibe “Acenda a luz ”, quando a variável time armazena um valor que é mais do que ¾ do caminho para o maior valor do tempo (luz mais baixa). O bloco de código ELSEIF exibe apenas “Apague a luz” quando a variável tempo armazena um valor que é menos de ¼ do caminho acima do menor valor do tempo (mais brilhante). Salve PhototransistorAnalogToBinary.bs2 como PhotransistorHysteresis.bs2. Antes de modificar PhotransistorHysteresis.bs2, teste-o para certificar-se se a entrada existente funciona. Se a iluminação mudou, repita as etapas de calibração valMin e valMax (antes do código de exemplo PhototransistorAnalogToBinary.bs2). Substitua a declaração IF...ELSE...ENDIF do PhotransistorHysteresis.bs2 's por IF...ENDIF...ELSEIF que acabamos de discutir. Carregue o PhotransistorHysteresis.bs2 para o BASIC Stamp. Teste e verifique se a entrada “Acenda a luz” está mais escura, e a entrada “Apague a luz” está mais clara. Se você adicionar um circuito de LED e modificar o código para que ele ligue e desligue o LED, algumas coisas interessantes podem acontecer. Especialmente se você colocar o LED próximo ao fototransistor, você ainda pode ver o comportamento ligado e desligado quando fica escuro, mesmo com a histerese programada. Quão longe do fototransistor o LED tem que estar para obter os dois limiares e evitar comportamento on / off? Assumindo que valMin e valMax são as mesmas em ambos os programas, a que distância o LED tem que estar para o PhototransistorAnalogToBinary.bs2 sem modificações funcionar corretamente? Página - 188 TTL Vs. Gatilho Schmitt Seu pino de I/O do BASIC Stamp envia e recebe sinais usando a lógica transistor-transistor (TTL). Como saída, o pino de I/O envia um sinal de 5 V de alta ou 0 V de sinal de baixa. O lado esquerdo da Figura 7-18 mostra como o pino de I/O comportando-se como uma entrada. O pino de I/O no registro IN (IN0, IN1, IN2 etc.) armazena 1 se a tensão aplicada está acima de 1,4 V, ou se está abaixo de 1,4 V. Estes são mostrados como Logic 1 e Logic 0 na figura. Um gatilho de Schmitt é um circuito representado pelo símbolo no centro da Figura 7-18. O lado direito da Figura 7-18 mostra como um pino de I/O configurado como entrada se comportaria se tivesse um circuito de disparo Schmitt construído nele. O gatilhos de Schmitt tem histerese da mesma forma que o código PBASIC com duas entradas tem. O valor de entrada armazenada pelo registro INx do pino de I/O não muda de 0 a 1 até que a tensão de entrada esteja acima de 4,25 V. Da mesma forma, não muda de 1 para 0 até que a tensão de entrada passe abaixo de 0,75 V. O BASIC Stamp 2px tem um comando PBASIC que permite que você configure seus pinos de entrada para Schmitt. Figura 7-18 TTL Vs. Limites do Gatilho Schmitt e Símbolo Limite TTL Símbolo do Gatilho de Schmitt 5V Limite Gatilho de Schmitt 5V Logic 1 ≈4.25 V Logic 1 No Change ≈1.4 V Logic 0 ≈0.75 V 0V 0V Logic 0 Ajustando o Circuito para Situações de On / Off Como mencionado no Capítulo 5, Atividade #2, o limite de tensão para um pino de I/O do BASIC Stamp é de 1,4 V. Quando um pino de I/O é definido como entrada, tensões acima de 1,4 V aplicada ao pino I/O resultam em um binário 1 e tensões abaixo de 1,4 V resultam em um binário 0. O nó Vo no circuito representado na figura 7-19 varia em tensão com a luz. Este circuito pode ser ligado a um pino de I/O do BASIC Stamp, e com pouca luz, a tensão vai passar abaixo do limiar de 1.4 V do BASIC Stamp e o registro de entrada do pino de I/O vai armazenar 0. Em condições de luz brilhante, Vo ultrapassa 1,4 V, e o registro de entrada do pino de I/O vai armazenar 1. Figura 7-19 Saída de Tensão do Circuito de Luz + V – =R I Página - 189 A razão pela qual a tensão Vo muda com os níveis de luz é devido a Lei de Ohm, que indica que a tensão através de uma resistência (V na Figura 7-19) é igual à corrente que passa através dessa resistência (I), multiplicada pela resistência do resistor (R). V=I×R Lembre-se que um fototransistor deixa passar mais corrente quando exposto a mais luz e menos energia quando exposto a menos luz. Vamos dar uma olhada mais detalhada no circuito de exemplo na Figura 7-19 e calcular a quantidade de corrente que o resistor teria que passar para criar uma queda de 1,4 V sobre o resistor. Primeiro, sabemos que o valor do resistor é de 10 kΩ, ou 10 000 Ω. Nós também sabemos que queremos que a tensão seja igual a 1,4 V, por isso precisamos modificar a Lei de Ohm para resolver I. Para fazer isso, divida ambos os lados da equação V = I × R por R, o que resulta em I = V ÷ R. Em seguida, substitua os valores que você conhece (V = 1,4 V e R = 10 kΩ) e resolver para I. I = = = = = = V÷R 1.4 V ÷ 10 kΩ 1.4 V ÷ 10,000 Ω 0.00014 V/Ω 0.00014 A 0.14 mA Agora, se o transistor permitisse que por duas vezes mais corrente passasse por ele, porque está mais brilhante, qual seria a tensão através do resistor? Por duas vezes a corrente, I = 0,28 mA, e a resistência ainda é 10 kΩ, então agora estamos de volta para resolver V da equação original V = I × R com I = 0,28 mA e R = 10 kΩ. V = = = = = I×R 0.28 mA × 10 kΩ 0.00028 A × 10,000 Ω 2.8 AΩ 2.8 V Com 2,8 V aplicada a um pino de I/O, o seu registro de entrada iria armazenar 1 desde que 2,8 V esteja acima de 1,4 V da tensão de entrada do pino de I/O. Sua Vez – Mais Cálculos E se o fototransistor permitisse a metade da tensão da corrente de entrada (0,07 mA) através do circuito, qual seria a voltagem através da resistência? Além disso, qual seria o registro de entrada que o pino de I/O armazenaria? Teste do Sensor Binário de Luz O teste do circuito do sensor binário de luz é muito parecido com o teste do circuito de botão do Capítulo 3. Quando o circuito é ligado a um pino de I/O, a tensão será ou acima ou abaixo do limiar de 1,4V do pino de I/O do BASIC Stamp o que resultará em um 1 ou um 0, que poderá ser exibido com o DEBUG Terminal. Página - 190 Peças para o Sensor de Luz Analógico para Binário (1) Fototransistor (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (1) Resistor – 10 kΩ (marrom-preto-laranja) (1) Resistor – 2 kΩ (vermelho-preto-vermelho) (1) Resistor – 4.7 kΩ (amarelo-violeta-vermelho) (1) Resistor – 100 kΩ (marrom-preto-amarelo) (2) Fios Circuito para o Sensor de Luz Analógico para Binário Com o circuito mostrado na Figura 7-20, o circuito se comporta como uma sombra controlada pelo botão. A sombra resulta em in2 = 0, luz brilhante resulta em in2 = 1. Tenha em mente que um pino de I/O configurado como entrada não afeta o circuito que monitora porque não aumenta ou reduz qualquer corrente. Isto faz com que tanto o pino de I/O e quanto o resistor de 220 Ω fiquem essencialmente invisíveis para o circuito. Assim, os resultados de tensão de circuito dos nossos cálculos a partir da secção anterior sejam os mesmos com ou sem o resistor de 220 Ω e pino de I/O ligados. Construa o circuito mostrado na Figura 7-20. Figura 7-20: Esquema e Diagrama de fiação para circuito do sensor de luz analógico para binário ligado a um pino de I / O Código De Teste Para O Sensor De Luz Analógico Para Binário TestBinaryPhototransistor.bs2 é uma versão modificada do ReadPushbuttonState.bs2 do Capítulo 3, Atividade #2. Além de ajustar as observações, há uma mudança para o programa atual que é a linha DEBUG? IN2, que era DEBUG? IN3 no programa de exemplo de botão, porque o botão de pressão foi ligado a P3 em vez de P2. Reveja o Capítulo 3, Atividade #2 (página 55). Use o TestBinaryPhototransistor.bs2 abaixo para verificar se a luz brilhante do fototransistor resulta em 1, enquanto a escuridão resulta em 0. Você pode precisar de uma luz bem forte. Se a sua iluminação interna ainda resultar em 0, tente luz do sol ou use uma lanterna bem de perto. Um recurso alternativo para baixa iluminação é substituir o resistor de 10 kΩ por um resistor de 100 kΩ. Página - 191 ' O que é um Microcontrolador - TestBinaryPhototransistor.bs2 ' Verifique o estado da saída binária do circuito do fototransistor a ' cada ¼ de segundo. ' {$STAMP BS2} ' {$PBASIC 2.5} DO DEBUG ? IN2 PAUSE 250 LOOP Testando Resistências em Série Dê uma olhada nos cálculos V = I × R cálculos anteriormente realizados nesta atividade. Se a resistência em série é de 1/5, o valor da tensão através da resistência será de 1/5 para as mesmas condições de iluminação. Da mesma forma, uma resistência que é 10 vezes maior do que isso fará com que a tensão seja dez vezes maior. O que isso faz para o seu circuito? Um resistor de 100 kΩ no lugar de um resistor de 10 kΩ significa que o fototransistor só tem de conduzir a corrente 1/10 para cruzar o limiar de 1,4V do pino de I/O do BASIC Stamp, o que significa que ele leva menos luz para desencadear um binário 1 na entrada do pino de I/O e se fazer notar. Isto pode funcionar como um sensor num ambiente que é supostamente escuro, uma vez que será sensível a pequenas quantidades de luz. Em contraste, 1/5 do valor da resistência significa que o fototransistor tem que conduzir 5 vezes corrente para obter a tensão através da resistência e atravessar o limiar de 1,4 V, que por sua vez significa levar mais luz para acionar o binário 1 no registro de entrada do pino de I/O. Assim, este circuito seria melhor para detectar luz mais forte. Experimente os resistores de 2 kΩ, 4,7 kΩ, 10 kΩ e 100 kΩ e compare as alterações na sensibilidade à luz com cada resistor. Sua Vez – Indicador de Baixo Nível de Luz Escolha um resistor com a melhor resposta a 1/0 a baixos níveis de luz em sua área de trabalho. Adicione o LED apresentado no Capítulo 3, Atividade #3, para o circuito limiar do fototransistor. Coloque algo entre o LED e o fototransistor para que o fototransistor não possa "ver" o LED. Isto elimina o potencial de interferência entre os dois dispositivos. Modifique o programa para que ele faça piscar a luz quando a sombra é projetada sobre o fototransistor. ATIVIDADE #6: PARA DIVERSÃO - MEÇA A LUZ EXTERNA COM UM LED Como mencionado anteriormente, o circuito introduzido na Atividade #1 é projetado para medições de luz no interior. E se o seu aplicativo precisar fazer as medições de luz ao ar livre? Uma opção seria encontrar um fototransistor que gerasse menos corrente para a mesma quantidade de luz. Outra opção seria a utilização de um dos outros sensores de luz do kit “O que é um Microcontrolador”. Eles estão disfarçados de LEDs e executam muito bem as medições de luz mais intensas. Página - 192 Quando a corrente elétrica passa através do LED, que emite luz, o que você acha que acontece quando a luz brilha em um LED? Sim, de fato, ela pode causar uma corrente elétrica que flua através de um circuito. Figura 7-21 mostra um circuito de LED para detectar os níveis de luz ao ar livre e em outras áreas com luz mais intensa. Enquanto o fototransistor permite que a corrente passe é aplicada uma pressão elétrica fornecida (voltagem), o LED é mais parecido com um pequeno painel solar que cria a sua própria tensão para fornecer a corrente. Na medida em que a deterioração do circuito RC é a causa, o resultado com um LED é praticamente o mesmo. O LED conduz mais corrente e drena a carga do capacitor mais rapidamente, com mais luz, conduz menos corrente e drena mais lentamente com menos luz. Yello Figura 7-21 Esquema para o LED no circuito do sensor de luz RC-Time Porque o LED é ligado para trás? No Capítulo 2, o ânodo do LED foi ligado ao resistor de 220Ω e o cátodo foi ligado ao terra. Esse circuito fez o LED emitir luz como resultado da passagem de corrente elétrica através do LED quando a tensão foi aplicada ao circuito. Quando a luz está brilhando sobre o LED, cria uma pequena tensão que gera uma pequena corrente no sentido oposto. Assim, o LED tem que ser ligado para trás de modo que ele conduza a corrente e permita que o capacitor drene através dele para as medições de queda de RC. Peças do Sensor de Luz do LED (1) LED – amarelo (1) LED – verde (1) LED – vermelho (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (1) Fio Circuito do Sensor de Luz de LED Uma diferença importante entre o LED e o fototransistor é que o LED conduz muito menos corrente para a mesma quantidade de luz, por isso é preciso muita luz para o LED conduzir corrente suficiente para descarregar o capacitor de forma suficientemente rápida para a medição RCTIME. Lembre-se que a máxima medição de tempo que RCTIME pode medir é 65535 × 2 µs ≈ 131 ms. Assim, para boas medidas de queda de RC com o BASIC Stamp, é necessário um capacitor muito menor. Na verdade, o circuito trabalha melhor sem qualquer capacitor externo. O LED tem uma pequena quantidade de capacitância dentro dele, chamada capacitância de junção, e os clipes de metal que prendem os fios que você pluga na placa de ensaio também têm capacitância. Esta é a razão de um capacitor ser duas placas metálicas separadas por um isolador chamado dielétrico. Assim, dois clipes de metal dentro do protoboard, separados por plástico e ar, formam um capacitor. A combinação de junção capacitância do LED e capacitância do clip do protoboard faz com que você possa usar o LED sem capacitor externo, como mostrado na Figura 7-22. Página - 193 Construa o circuito mostrado na Figura 7-22 e na Figura 7-23, usando o LED amarelo. Certifique-se de observar a polaridade representada nas figuras! Figura 7-202 Esquema do Circuito de LED RCTIME Local plano e mais curto do pino cátodo Figura 7-23 Diagrama de Fiação do Circuito RC Time do LED. Pino ânodo mais longo Testando o Sensor de Luz de LED com Código O circuito de detecção de luz com LED pode ser testado em uma sala bem iluminada ou ao ar livre durante o dia. Em uma sala mal iluminada os tempos de medição são susceptíveis de exceder 65535, caso em que RCTIME vai armazenar a zero na variável resultado. Na maioria das situações, o código é o mesmo código de Atividade #1, TestPhototransistor.bs2. Se você estiver em uma sala bem iluminada tente o seguinte: Execute TestPhototransistor.bs2 da Atividade #1. Aponte o LED para a fonte de luz mais brilhante, colocando sua placa em direção a ela. Gradualmente, leve a placa para longe da fonte de luz mais brilhante na sala, os valores indicados pelo DEBUG Terminal devem ficar maiores conforme a luz ficar mais fraca. Se você tem uma lanterna brilhante, tente o seguinte: Execute TestPhototransistor.bs2 da Atividade #1. Elimine fontes de luz mais brilhantes, como a luz do sol entrando pelas janelas. Ligue a lanterna e aponte para o topo do LED, a uma distância de cerca de 10 cm. Se possível, desligue algumas das luzes fluorescentes de forma que os níveis de luz ambiente fiquem baixos. Página - 194 Veja as medições que o DEBUG Terminal exibe conforme você aumenta gradualmente a distância da lanterna do topo do LED. Isto permitirá que você determine a distância entre a lanterna e o LED. Se você está em uma sala só com luzes fluorescentes e sem fontes de luz brilhantes: Execute TestPhototransistor.bs2 da Atividade #1. Elimine as fontes de luz mais brilhantes, como a luz do sol nas janelas. Se possível, desligue algumas das luzes fluorescentes de modo que os níveis de luz fiquem baixos. Aponte o LED para o seu computador como se ele tivesse quase tocando-o e veja se as medidas permitem distinguir entre as várias cores da tela. Testes ao ar livre: Execute StoreLightMeasurementsInEeprom.bs2 da Atividade #2. Desligue o cabo de programação e leve sua placa para fora. Aponte sua placa de forma que o LED esteja apontando diretamente para o sol. Pressione e solte o botão Reset da sua placa para reiniciar o programa de registro de dados. Aos poucos rode sua placa longe do sol por mais de 2 ½ minutos. Leve sua placa de volta para dentro e volte a ligar ao PC. Execute ReadLightMeasurementsFromEeprom.bs2 e examine as medições de luz. Desde que você, gradualmente, levou o LED para longe do sol, as medições sucessivas devem ficar maiores. Sua Vez – O Seu BASIC Stamp Consegue Diferenciar Vermelho de Verde? Na Figura 7-2, verde está no centro do espectro, e vermelho está a direita. Se você baixar a versão colorida em PDF deste livro do site www.parallax.com, você pode colocar o verde e, em seguida, o LED vermelho contra a tela e registra medições de luz em todo o espectro de cores. Então, comparando as menores medições com cada LED, você pode detectar que seu LED é colocado contra verde ou vermelho na tela. Comece o circuito de detecção de luz com um LED verde na Figura 7-22 e Figura 7-23. Baixe a versão em PDF “O que é um microcontrolador do site www.parallax.com/go/WAM. Exiba o espectro de cores mostrado na Figura 7-2 (página 162) em seu monitor, e dê um zoom na imagem. Com o programa TestPhototransistor.bs2 exibindo medições no DEBUG Terminal, segure a placa de modo que a cúpula do LED verde esteja apontando diretamente para o monitor, todo o espectro de cores. Para melhores resultados, a cúpula do LED deve apenas estar mal tocando o monitor, e os níveis de luz na sala devem ser bastante baixos. Deslize o LED verde lentamente ao longo da barra do espectro exibido no monitor e observe a cor que resultou na menor medida. Repita com o LED vermelho. Será que o LED vermelho relatou medições mais baixas sobre o vermelho, enquanto o LED verde relatou medições menores sobre o verde? Página - 195 As menores medições do LED vermelho devem ocorrer ao longo da cor vermelha na tela, e as menores medições para o LED verde devem ocorrer ao longo do verde na tela. SUMÁRIO Este capítulo introduziu sensores de luz e descreveu como eles são utilizados em uma variedade de produtos. Sensores de luz diferentes detectam diferentes tipos de luz, e suas folhas de dados descrevem sua sensibilidade relativa ao comprimento das ondas de luz. Este capítulo focou no fototransistor, um dispositivo que controla a corrente através de seus terminais coletores e emissores pela quantidade de luz que brilha no seu terminal de base. Porque a luz pode controlar a quantidade de corrente que conduz um fototransistor, a técnica para medir a posição do botão de um potenciômetro no Capítulo 5 circuito RC também funciona para medir a luz que brilha em um fototransistor. O tempo que leva para um capacitor perder sua carga resulta de uma medição RC Time no fototransistor que fornece um número que corresponde ao brilho da luz sobre o fototransistor. Os registros de dados, armazenando medições de luz na parte não utilizada a memória de programa EEPROM do módulo BASIC Stamp também foi introduzido. Os comandos WRITE e READ foram usados para armazenar valores e para recuperar valores da EEPROM do módulo BASIC Stamp. O volume de números envolvidos no registro de dados pode ser difícil de analisar, mas colocando os dados em um gráfico fica mais fácil de ver padrões, tendências e eventos. Os dados registrados podem ser transferidos para planilhas eletrônicas convencionais e gráficas, alguns utilitários gráficos podem até substituir o DEBUG Terminal, e podem traçar os valores do BASIC Stamp em um gráfico, ao invés de exibi-los como texto. Um exemplo de aplicação do medidor de luz também foi desenvolvido, demonstrando como medições de luz podem ser utilizadas para controlar outro processo, neste caso, a taxa de um padrão circular exibida por um LED de 7 segmentos. Estas aplicações também são usadas nas subrotinas para realizar três empregos diferentes para a aplicação do medidor de luz. O BASIC Stamp pode ser programado para converter uma medida de tempo de queda RC para um valor binário com declarações IF...THEN. Além disso, o programa pode tomar uma série de medidas de queda de RC e aplicar histerese com uma entrada "Acenda a luz" que está na área escura das medidas e um entrada "Apague a luz" que está na faixa mais leve. Isto pode ajudar a prevenir oscilações de ligar / desligar que possam ocorrer quando o sensor relatar escuridão e o dispositivo ligar uma luz na área. Sem histerese, o dispositivo pode sentir esta luz, desligar e repetir este ciclo indefinidamente. Uma abordagem de hardware para detecção de ligar/desligar a luz é a aplicação de energia em série para o fototransistor com um resistor. De acordo com a Lei de Ohm, a quantidade de corrente que o fototransistor conduz afeta a tensão sobre o resistor. Esta tensão variável pode ser conectada a um pino de I/O, e resultará num binário 1, se a tensão for superior a limiar de 1,4 V do pino de I/O, ou um binário 0 se for abaixo do limiar. O LED (diodo emissor de luz) que emite luz quando a corrente passa por ele também se comporta como um pequeno painel solar quando a luz incide sobre ele, gerando uma Página - 196 pequena tensão que por sua vez pode levar corrente elétrica para os circuitos. As correntes que o LED gera são suficientemente pequenas para que uma combinação da própria capacitância de junção do LED e a capacitância inerente aos grampos dentro da protoboard forneçam capacitância suficiente para um circuito RC com nenhuma queda do resistor externo. Enquanto o fototransistor do kit “O que é um Microcontrolador?” tem melhor desempenho dentro de casa, o LED é excelente para medições de luz mais intensa e ao ar livre. Questões 1. Quais são alguns exemplos de aplicações de iluminação automática que dependem de sensores de luz ambiente? 2. Quais são alguns exemplos de produtos que respondem às mudanças no brilho da luz ambiente? 3. Qual a faixa de comprimento de onda que o espectro de luz visível está situada? 4. Quais são os nomes dos terminais do fototransistor, e qual deles controla a quantidade de corrente que o dispositivo permite passar? 5. O que significa EEPROM? 6. Quantos bytes podem armazenar a EEPROM do módulo BASIC Stamp? Quantos bits ele pode armazenar? 7. Qual comando você usa para armazenar um valor em uma EEPROM? Qual comando que você usa para recuperar um valor de uma EEPROM? Qual delas requer uma variável? 8. O que é um rótulo? 9. O que é uma sub-rotina? 10. Que comando é usado para chamar uma sub-rotina? Qual comando é usado para terminar uma sub-rotina? Exercícios 1. Desenhe o esquema de um circuito RC-time de fototransistor conectado a P5. 2. Modifique TestPhototransistor.bs2 de modo que ele funcione em um circuito ligado a P5, em vez de P2. 3. Explique como você poderia modificar LightMeter.bs2 para que o teste de padrão circular exibido pelo display de LED de 7 segmentos vá na direção oposta. Projetos 1. Faça um pequeno protótipo de um sistema que automaticamente feche as cortinas quando fica muito brilhante e abra novamente quando fica menos brilhante. Use o servo para um atuador mecânico. Dica: Para obter o código, você pode adicionar dois comandos de controle do servo para PhototransistorAnalogToBinary.bs2, e mudar o comando PAUSE 100 para PAUSE 1. Certifique-se de seguir as instruções do texto para calibrar as condições de luz na área antes de testar. 2. Como crédito extra, melhore a sua solução para o projeto 1, incorporando as modificações de histerese discutidas na Atividade #5. Página - 197 Soluções Q1.Os faróis dos carros, postes e luzes de segurança ao ar livre que ligam automaticamente quando está escuro. Q2.Monitores portáteis e câmeras com exposição automática. Q3.380 nm a 750 nm de acordo com a Figura 7-2, na página 162. Q4.Coletor, base e emissor. A base controla a quantidade de corrente passa para o coletor e volta para fora do emissor. Q5.Electrically Erasable Programmable Read-Only Memory. Q6.2048 bytes. 2048 x 8 = 16,384 bits. Q7.Para armazenar um valor - WRITE, Para recuperar um valor - READ, o comando READ requer uma variável. Q8.A etiqueta é um nome que pode ser usado como um marcador em um programa PBASIC. Q9.Uma sub-rotina é um pequeno segmento de código que faz um determinado trabalho. Q10. Chamando: GOSUB; terminando: RETURN E1. Esquema baseado na Figura 7-4, na página 164, com P2 mudou para P5. E2. As modificações necessárias são muito semelhantes as descritas na página 164. DO HIGH 5 PAUSE 100 RCTIME 5, 1, time DEBUG HOME, "time = LOOP ", DEC5 time E3. Para ir em direção oposta, os padrões devem ser exibidos na ordem inversa. Isso pode ser feito mudando os padrões em ao redor da instrução PROC, ou invertendo a ordem em que se olhou para cima. Aqui estão duas soluções feitas com sub-rotinas alternativas UPDATE_DISPLAY. Solução 1 Solução 2 Update_Display: IF index = 6 THEN index = 0 ' BAFG.CDE LOOKUP index, [ %01000000, Index = 5 '<<Add after Index variable Update_Display: ' BAFG.CDE LOOKUP index, [ %01000000, %10000000, Página - 198 %10000000, %00000100, %00000010, %00000001, %00100000 ], %00000100, %00000010, %00000001, %00100000 ], OUTH index = index + 1 RETURN OUTH IF (index = 0) THEN index = 5 ELSE index = index - 1 ENDIF RETURN P1. Fototransistor da Figura 7- 4 na página 164, esquema do servo para a sua placa do Capítulo 4, Atividade # 1. ' O que é um Microcontrolador - Ch07Prj01_Blinds_Control.bs2 ' Controla a posição do servo usando luz. ' {$STAMP BS2} ' {$PBASIC 2.5} valMax valMin time CON CON VAR 4000 100 Word PAUSE 1000 DO HIGH 2 PAUSE 1 RCTIME 2, 1, time DEBUG HOME, "time = ' PAUSE 100 -> PAUSE 1 ", DEC5 time time = time MAX valMax MIN valMin IF time > (valMax - valMin) / 2 THEN DEBUG CR, "Abre cortina " PULSOUT 14, 500 ELSE DEBUG CR, "Fecha cortina " PULSOUT 14, 1000 ENDIF ' Modifique ' Adicione ' Modifique ' Adicione LOOP P2. Funcionalidade de Histerese adicionada como crédito extra: ' O que é um Microcontrolador ' Ch07Prj02_Blinds_Control_Extra.bs2 ' Controla a posição do servo usando luz e incluindo histerese. ' {$STAMP BS2} ' {$PBASIC 2.5} valMax valMin CON CON 4000 100 Página - 199 time VAR Word PAUSE 1000 DO HIGH 2 PAUSE 1 RCTIME 2, 1, time DEBUG HOME, "time = ' PAUSE 100 -> PAUSE 1 ", DEC5 time time = time MAX valMax MIN valMin IF time > (valMax - valMin) / 4 * 3 THEN DEBUG CR, "Abre cortina " PULSOUT 14, 500 ELSEIF time < (valMax - valMin ) / 4 THEN DEBUG CR, "Fecha cortina" PULSOUT 14, 1000 ENDIF LOOP ' Modifique ' Adicione ' Modifique ' Adicione Página - 200 Capítulo 8: Frequência e Som O SEU DIA E BIPS ELETRÔNICOS Aqui estão alguns exemplos de bips que você pode ouvir durante um dia normal: O forno de micro-ondas emite um bip sonoro quando sua comida está pronta. O telefone celular tem diferentes tons de bips que se assemelham a músicas para chamar sua atenção quando alguém te liga. O caixa eletrônico emite um bip para lembrá-lo de não esquecer seu cartão. Os bips da caixa registradora da loja deixam o contador saber qual código de barras de um item do supermercado foi lido pelo digitalizador. Muitas calculadoras emitem bips quando as teclas são pressionadas de forma errada. Você pode ter começado o dia com um bip de seu despertador. MICROCONTROLADORES, ALTO-FALANTES E SINAIS ON/OFF Praticamente todos os bips eletrônicos que você ouve durante a sua rotina diária são feitos por microcontroladores conectados a alto-falantes. O microcontrolador cria esses bips enviando sinais rápidos de alta/baixa para vários tipos de alto-falantes. A taxa desses sinais de alta/baixa é chamada de frequência, e determina o tom ou a intensidade do bip. Cada vez que um sinal de alta/baixa se repete, ele é chamado de um ciclo. Muitas vezes você vai ver o número de ciclos por segundo referidos como hertz, e é abreviado Hz. Por exemplo, uma das frequências mais comuns de bips que as máquinas de ajuda usam para chamar sua atenção é de 2 kHz. Isso significa que os sinais de alta/baixa se repetem 2 000 vezes por segundo. APRESENTANDO O SPEAKER PIEZOELÉTRICO Nesta atividade, você vai experimentar enviar uma variedade de sinais para um altofalante comum, pequeno e barato chamado piezoelétrico. Um alto-falante piezoelétrico é comumente referido como um alto-falante ou uma campainha piezo. Seu símbolo esquemático e desenho da peça são mostrados na Figura 8- 1. Figura 8-1 Desenho da peça e símbolo esquemático do alto-falante piezoelétrico. ATIVIDADE #1: CRIANDO E TESTANDO O ALTO-FALANTE Nesta atividade, você vai construir e testar o circuito de alto-falante piezoelétrico. Peças do Circuito do Alto-Falante (1) Alto-falante piezoelétrico (2) Fios Página - 201 Construindo o Circuito do Alto-Falante Piezoelétrico O terminal negativo do alto-falante piezoelétrico deve ser ligado a Vss e o terminal positivo deve ser ligado a um pino de I/O. O BASIC Stamp, então, será programado para enviar sinais de alta/baixa para o terminal positivo do falante piezoelétrico. Se o seu alto-falante piezo tiver um adesivo sobre ele, basta removê-lo (não há necessidade de lavar). Construa o circuito mostrado na Figura 8-2. Vdd Vin Vss X3 P9 Vss P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 + Figura 8-1 Esquema e Diagrama de Fiação do Circuito do Alto-Falante Piezoelétrico Como Funciona o Circuito do Alto-Falante Piezoelétrico Quando uma corda de violão vibra, ela provoca mudanças na pressão do ar. Essas mudanças na pressão do ar são o que seu ouvido detecta como um tom. Quanto mais rápidas as alterações na pressão do ar, mais alto é o tom, e quanto mais lentas, mais baixo. O elemento dentro de caixa de plástico do alto-falante piezo é chamado um elemento piezoelétrico. Quando sinais de alta / baixa são aplicados ao terminal positivo do alto-falante, o elemento piezoelétrico vibra provocando mudanças na pressão do ar, da mesma maneira que uma corda de violão faz. Tal como acontece com a corda da guitarra, seu ouvido detecta as alterações na pressão do ar causadas pelo alto-falante piezoelétrico, que normalmente soa como um bip ou um tom. Programando o Controle do Alto-Falante. O comando FREQOUT é uma maneira conveniente de enviar sinais de alta/baixa a um alto-falante para obter um som. O manual do BASIC Stamp mostra uma sintaxe do comando como esta: FREQOUT Pin, Duration, Freq1 {, Freq2} Tal como acontece com a maioria dos outros comandos usados neste livro, Pin é um valor que você pode usar para escolher qual pino de I/O usar no BASIC Stamp. O argumento Duration é um valor que diz ao comando FREQOUT quanto tempo o tom deve soar em milésimos de segundos. O argumento Freq1 é usado para definir a frequência do tom, em hertz. Existe um argumento opcional Freq2 que pode ser utilizado para reproduzir dois tons diferentes ao mesmo tempo. Esta é a sintaxe para o envio de um tom do pino de I/O P9 que dura 1,5 segundos e tem uma frequência de 2 kHz: Página - 202 FREQOUT 9, 1500, 2000 Programa de Exemplo: TestPiezoWithFreqout.bs2 Este programa de exemplo envia o tom de 2 kHz para o alto-falante no pino de I/O P9 por 1,5 segundos. Você pode usar o DEBUG Terminal para ver quando o alto-falante deveria estar bipando e quando deveria parar. Coloque e execute TestPiezoWithFreqout.bs2. Verifique se o alto-falante emite um tom claramente audível durante o tempo em que o DEBUG Terminal exibe a mensagem "Enviando o tom...” (“Tone sending...”). ' O que é um Microcontrolador - TestPiezoWithFreqout.bs2 ' Envie um tom ao piezospeaker utilizando o comando FREQOUT. '{$STAMP BS2} '{$PBASIC 2.5} PAUSE 1000 DEBUG "Enviando tom...", CR FREQOUT 9, 1500, 2000 DEBUG "Tom enviado." Sua Vez – Regular Frequência e Duração Salve TestPiezoWithFreqout.bs2 com um nome diferente. Tente alguns valores diferentes para os argumentos Duration e Freq1. Após cada alteração, execute o programa e tome nota do efeito. No momento em que o argumento Freq1 ficar maior, pode a intensidade do tom ir para cima ou para baixo? Experimente valores de 1500, 2000, 2500 e 3000 para responder a esta pergunta. ATIVIDADE #2: SONS DE AÇÃO Muitos brinquedos contêm microcontroladores, que são usados para fazer “sons de ação”. Sons de ação tendem a se envolver rapidamente mudando a frequência desempenhada pelo alto-falante. Você também pode obter alguns efeitos interessantes executando dois tons diferentes ao mesmo tempo, utilizando argumento opcional Freq2 do comando FREQOUT. Esta atividade apresenta ambas as técnicas. Programando Sons de Ação Os sons de ação de eletrodomésticos têm três componentes diferentes: 1. Pausa 2. Duração 3. Frequência A pausa é o tempo entre os tons, e você pode usar o comando PAUSE para criá-la. A duração é a quantidade de tempo que um tom dura e você pode configurá-la usando o Página - 203 argumento Duration do comando FREQOUT. A frequência determina a intensidade do tom. Quanto mais elevada for a frequência, mais elevado o tom, quanto menos elevada for frequência, menos elevado é o tom. Isto é, naturalmente, determinado pelo argumento Freq1 do comando FREQOUT. Exemplo de Programa: ActionTones.bs2 ActionTones.bs2 demonstra algumas combinações diferentes de PAUSE, Duration e Frequency. A primeira sequência de tons soa semelhante a um alarme eletrônico de relógio. O segundo, pode-se dizer, soa algo semelhante a um robô em um filme de ficção. O terceiro é mais o tipo de efeito sonoro que você pode ouvir em um velho jogo de vídeo. Coloque e execute ActionTones.bs2. ' O que é um Microcontrolador - ActionTones.bs2 ' Demonstra como diferentes combinações de pausa, duração e frequência ' podem ser utilizadas para criar diferntes efeitos sonoros. '{$STAMP BS2} '{$PBASIC 2.5} duration frequency VAR VAR Word Word PAUSE 1000 DEBUG "Alarme...", PAUSE 100 FREQOUT 9, 500, PAUSE 500 FREQOUT 9, 500, PAUSE 500 FREQOUT 9, 500, PAUSE 500 FREQOUT 9, 500, PAUSE 500 CR DEBUG "Imitando um PAUSE 100 FREQOUT 9, 100, FREQOUT 9, 200, FREQOUT 9, 140, FREQOUT 9, 30, PAUSE 500 robô...", CR 1500 1500 1500 1500 2800 2400 4200 2000 DEBUG "Hiperespaço...", CR PAUSE 100 FOR duration = 15 TO 1 STEP 1 FOR frequency = 2000 TO 2500 STEP 20 FREQOUT 9, duration, frequency NEXT NEXT DEBUG "Pronto!", CR END Página - 204 Como Funciona ActionTones.bs2 A rotina de “alarme” soa como um despertador. Esta rotina toca sons em uma frequência fixa de 1,5 kHz, com duração de 0,5 s com atrasos fixos entre os tons de 0,5 s. A rotina de “imitando um robô" usa várias frequências por breves períodos. A rotina de “hiperespaço” não atrasa, mas a frequência e a duração podem variar. Usando o loop FOR...NEXT para mudar rapidamente as variáveis de frequência e duração, você pode obter alguns efeitos sonoros interessantes. Quando um loop FOR...NEXT é executado dentro de outro, é chamado de um loop assentado. Aqui está como o loop assentado FOR...NEXT mostrado abaixo funciona. A variável de duração começa a 15, então o loop FOR frequency ... assume e envia frequências de 2.000, em seguida 2.020, depois 2040, e assim por diante, até 2500 através do alto-falante piezo. Quando o loop FOR frequency ... estiver concluído, o loop FOR duration... apenas repetiu um de seus 15 passos. Por isso, subtrai 1 do valor de duração e repete o loop FOR frequency...novamente. FOR duration = 15 TO 1 FOR frequency = 2000 TO 2500 STEP 15 FREQOUT 9, duration, frequency NEXT NEXT Programa de Exemplo: NestedLoops.bs2 Para entender melhor como os loops assentados FOR...NEXT trabalham, o NestedLoops.bs2 usa o comando DEBUG para mostrar o valor de uma versão muito menos complicada do loop assentado utilizado em ActionTones.bs2. Coloque e execute NestedLoops.bs2. Examine a saída do DEBUG Terminal e verifique como a duração e a frequência das variáveis mudam a cada vez através do loop. ' O que é um Microcontrolador - NestedLoops.bs2 ' Demonstra como o loop assentado em ActionTones.bs2 funciona. '{$STAMP BS2} '{$PBASIC 2.5} duration frequency VAR VAR Word Word PAUSE 1000 DEBUG "Duration "-------- Frequency", CR, ---------", CR FOR duration = 4000 TO 1000 STEP 1000 FOR frequency = 1000 TO 3000 STEP 500 DEBUG " " , DEC5 duration, " ", DEC5 frequency, CR FREQOUT 9, duration, frequency NEXT DEBUG CR NEXT END Página - 205 Sua Vez – Mais Efeitos Sonoros Existe uma infinidade de maneiras de modificar ActionTones.bs2 para obter diferentes combinações de som. Aqui está uma das modificações da rotina “Hiperespaço”: DEBUG "Salto de hiperespaço...", CR FOR duration = 15 TO 1 STEP 3 FOR frequency = 2000 TO 2500 STEP 15 FREQOUT 9, duration, frequency NEXT NEXT FOR duration = 1 TO 36 STEP 3 FOR frequency = 2500 TO 2000 STEP 15 FREQOUT 9, duration, frequency NEXT NEXT Salve o seu programa de exemplo com o seguinte ActionTonesYourTurn.bs2. Divirta-se com esta e outras modificações de sua própria criação. nome Duas Frequências de Uma Só Vez Você pode tocar duas frequências ao mesmo tempo. Lembre-se da sintaxe do comando FREQOUT de Atividade #1: FREQOUT Pin, Duration, Freq1 {, Freq2} Você pode usar o argumento opcional Freq2 para tocar duas frequências com um único comando FREQOUT. Por exemplo, você pode tocar 2 kHz e 3 kHz assim: FREQOUT 9, 1000, 2000, 3000 Cada tom do teclado de discagem é também um exemplo de duas frequências combinadas. Nas telecomunicações, é chamada de DTMF (Dual Tone Multi Frequency). Há também um comando chamado PBASIC DTMFOUT que é projetado apenas para o envio de sons de telefone. Para exemplos, procure este comando no Manual do BASIC Stamp ou na Ajuda. Exemplo de Programa: PairsOfTones.bs2 Este programa de exemplo demonstra a diferença no tom que você recebe quando você toca 2 e 3 kHz juntos. Ele também demonstra um fenômeno interessante que ocorre quando você adiciona duas ondas sonoras que estão muito próximas na frequência. Quando você toca 2000 Hz e 2001 Hz, ao mesmo tempo, o tom vai aumentar e diminuir uma vez por segundo (a uma frequência de 1 Hz). Se você tocar 2000 Hz a 2002 Hz, ele vai aumentar e diminuir duas vezes por segundo (2 Hz), e assim por diante. Página - 206 Ritmo é quando dois tons de frequência muito próximas são tocados juntos fazendo com que o som que se ouve aumente e diminua. A frequência do aumento e da diminuição é a diferença entre as duas frequências. Se a diferença é de 1 Hz, o tom aumenta e diminui em um 1 Hz. Se a diferença for de 2 Hz, o tom vai aumentar e diminuir em 2 Hz. As variações da pressão de ar feitas pelo alto-falante piezoelétrico são chamadas de ondas sonoras. Quando o tom é mais alto, as variações na pressão do ar causadas pelas frequências são adicionadas umas as outras (chamada de sobreposição). Quando o tom está bastante silencioso, as variações na pressão do ar vão sendo canceladas mutuamente (chamada de interferência). Coloque e execute PairsOfTones.bs2. Mantenha um olho no DEBUG Terminal enquanto os tons vão sendo reproduzidos e observe os diferentes efeitos diferentes tons. provenientes da mixagem dos ' O que é um Microcontrolador - PairsOfTones.bs2 ' Demonstra o que pode acontecer quando você mistyra dois tons. '{$STAMP BS2} '{$PBASIC 2.5} PAUSE 1000 DEBUG "Frequency = 2000", CR FREQOUT 9, 4000, 2000 DEBUG "Frequency = 3000", CR FREQOUT 9, 4000, 3000 DEBUG "Frequency = 2000 + 3000", CR FREQOUT 9, 4000, 2000, 3000 DEBUG "Frequency = 2000 + 2001", CR FREQOUT 9, 4000, 2000, 2001 DEBUG "Frequency = 2000 + 2002", CR FREQOUT 9, 4000, 2000, 2002 DEBUG "Frequency = 2000 + 2003", CR FREQOUT 9, 4000, 2000, 2003 DEBUG "Frequency = 2000 + 2005", CR FREQOUT 9, 4000, 2000, 2005 DEBUG "Frequency = 2000 + 2010", CR FREQOUT 9, 4000, 2000, 2010 DEBUG "Pronto!", CR END Sua Vez – Condensando o Código PairsOfTones.bs2 foi escrito para demonstrar algumas coisas interessantes que podem acontecer quando você toca duas frequências diferentes ao mesmo tempo usando o Página - 207 argumento opcional Freq2 do comando FREQOUT. No entanto, isto é extremamente ineficiente. Modifique PairsOfTones.bs2 para que ele percorra todos os argumentos Freq2 que vão de 2001 a 2005 usando uma variável de texto e um loop. ATIVIDADE #3: NOTAS MUSICAIS E CANÇÕES SIMPLES A Figura 8-3 mostra as 25 teclas da parte direita do teclado de um piano. Ela também mostra as frequências em que cada corda dentro do piano vibra quando acionadas pela tecla. Figura 8-3: Parte direita de um piano, suas teclas e frequências. As teclas e as suas notas correspondentes são rotuladas de C6 a C8. Estas teclas são separadas em grupos de 12, compostos por sete teclas brancas e cinco teclas pretas. A sequência de notas se repete a cada 12 teclas. As notas de uma mesma letra são relacionadas pela frequência, dobrando a cada oitava acima. Por exemplo, C7 é o dobro da frequência de C6, e C8 é o dobro da frequência de C7. Da mesma forma, se você for uma oitava abaixo, a frequência será a metade do valor, por exemplo, A6 é a metade da frequência de A7. Se você já ouviu um cantor solfejar as notas "Dó Ré Mi Fá Sol Lá Si Dó", ele está tentando combinar as notas recebidas ao “bater” as teclas brancas do teclado do piano. Essas teclas brancas são chamadas de teclas naturais, e o nome "oitava" refere-se a duplicação da frequência de cada oitava. A tecla preta em um piano pode ser chamada de sustenido ou bemol. Por exemplo, a tecla preta entre as teclas C e D é chamada CSustenido (C#) ou D-Bemol (Db). Uma tecla é chamada de sustenido ou bemol conforme a música que está sendo executada, mas as regras para isso é melhor deixar para as aulas de música. Página - 208 Pesquisa na Internet sobre "escala musical": Ao usar as palavras "escala musical", você vai encontrar informações fascinantes sobre história, física e psicologia do assunto. A 12 nota em uma oitava é a principal escala da música ocidental. Outras culturas utilizam escalas que contêm 2 a 35 notas por oitava. Método de Afinação: O teclado na Figura 8-3 utiliza um método de afinação chamado temperamento igual. As frequências são determinadas usando uma nota de referência, em seguida, multiplicando-a por 2 (n/12) para valores de n = 1, 2, 3 etc. Por exemplo, você pode ter a frequência de A6, e multiplicar por 2 (1/12) para obter a frequência de A6 #. Multiplique por 2 (2/12) para obter a frequência de B6, e assim por diante. Aqui está um exemplo de cálculo da frequência de B6 usando A6 como uma frequência de referência: A frequência de A6 é 1760 2(2/12) = 1.1224 1760 X 1.224 = 1975.5 1975.5 é a frequência de B6 Programando as Notas Musicais O comando FREQOUT também é útil para notas musicais. A programação do BASIC Stamp para reproduzir músicas usando um piezospeaker envolve seguir uma série de regras usadas na reprodução de músicas usando qualquer outro instrumento musical. Estas regras se aplicam aos mesmos elementos que foram usados para fazer os efeitos sonoros: frequência, duração e pausa. Este próximo programa de exemplo reproduz algumas das frequências de notas musicais no piezospeaker, cada uma com uma duração de meio segundo. Exemplo de Programa: DoReMiFaSolLaTiDo.bs2 Coloque e execute DoReMiFaSolLaTiDo.bs2 ' O que é um Microcontrolador - DoReMiFaSolLaTiDo.bs2 ' Envia uma oitava de meio segundo usando um alto-falante ' piezoelétrico. '{$STAMP BS2} '{$PBASIC 2.5} PAUSE 1000 'Solfege Tone Note DEBUG "Do...", CR: FREQOUT 9,500,1047 ' C6 DEBUG "Re...", CR: FREQOUT 9,500,1175 ' D6 DEBUG "Mi...", CR: FREQOUT 9,500,1319 ' E6 DEBUG "Fa...", CR: FREQOUT 9,500,1396 ' F6 DEBUG "Sol..", CR: FREQOUT 9,500,1568 ' G6 DEBUG "La...", CR: FREQOUT 9,500,1760 ' A6 DEBUG "Ti...", CR: FREQOUT 9,500,1976 ' B6 DEBUG "Do...", CR: FREQOUT 9,500,2093 ' C7 Página - 209 END Sua Vez – Notas Sustenido/Bemol Use as frequências mostradas na Figura 8-3 para adicionar cinco notas sustenidas/bemois para DoReMiFaSolLaTiDo.bs2 Modifique o programa para que ele reproduza a próxima oitava acima. Dica: Salve você mesmo a digitação e use apenas o operador * 2 após cada argumento Freq1. Por exemplo, FREQOUT 9, 500, 1175 * 2 vai multiplicar D6 por 2 para lhe dar D7, que é a nota D na sétima oitava. Armazenando e recuperarando seqüências de notas musicais. Uma boa maneira de salvar as notas musicais é armazená-las usando EEPROM do módulo BASIC Stamp. Embora você possa usar muitos comandos WRITE para fazer isso, a melhor maneira é usar a diretiva DATA. Esta é a sintaxe para a diretiva DATA: {Symbol} DATA {Word} DataItem {, {Word} DataItem, … } Aqui está um exemplo de como utilizar a diretiva DATA para armazenar os caracteres que correspondam às notas musicais. Notes DATA "C","C","G","G","A","A","G" Você pode usar o comando READ para acessar esses caracteres. A letra "C" está localizada no endereço Notes + 0, e uma segunda letra "C" está localizada em Notes + 1. Em seguida uma letra "G" em Notes + 2, e assim por diante. Por exemplo, se você deseja carregar a última letra "G" em uma variável byte chamada noteLetter, use o comando: READ Notes + 6, noteLetter Você também pode armazenar listas de números usando a diretiva DATA. Os valores de frequência e duração, que o BASIC Stamp usa para as notas musicais, precisam ser armazenados em variáveis de texto, porque eles são geralmente maiores do que 255. Aqui está como fazer isso com uma diretiva DATA: Frequencies DATA Word 2093, Word 2093, Word 3136, Word 3136, Word 3520, Word 3520, Word 3136 Uma vez que cada um desses valores ocupa dois bytes, acessá-los com o comando READ é diferente de acessar caracteres. O primeiro 2093 está em Frequencies + 0, mas o segundo 2093 está localizado em Frequencies + 2. O primeiro 3136 está localizado em Frequencies + 4, e o segundo 3136 está localizado em Frequencies + 6. Os valores em Frequencies da diretiva DATA correspondem com as notas musicais em Notes da diretiva DATA. Aqui está um loop FOR ... NEXT, que coloca notes DATA em uma variável chamada noteLetter, e coloca Frequencies DATA em uma variável chamada noteFreq. Página - 210 FOR index = 0 to 6 READ Notes + index, noteLetter READ Frequencies + (index * 2), Word noteFreq DEBUG noteLetter, " ", DEC noteFreq, CR NEXT O que o (índex * 2) faz? Cada valor armazenado em Frequencies da diretiva DATA leva uma palavra (dois bytes), enquanto cada caractere em Notes da diretiva DATA leva apenas um byte. O valor do índice aumenta em um cada vez através do loop FOR...NEXT. Isso é bom para acessar os caracteres de notas usando o comando READ Notes + index, noteLetter. O problema é que, para cada byte em Notes, a variável index precisa apontar duas vezes mais para baixo na lista Frequencies. O comando READ Frequencies + (index * 2), Word noteFreq, cuida disso. O próximo programa de exemplo armazena notas e durações usando DATA, e usa o comando FREQOUT para reproduzir cada frequência da nota por uma duração específica. O resultado é as primeiras notas da canção infantil “Brilha, Brilha Estrelinha” ("Twinkle Twinkle Little Star"). A "Canção do alfabeto", usada por crianças para memorizar os "ABCs" usa as mesmas notas de “Brilha, Brilha Estrelinha” ("Twinkle Twinkle Little Star"). Programa de Exemplo: TwinkleTwinkle.bs2 Este programa de exemplo demonstra como usar a diretiva DATA para armazenar as listas e como usar o comando READ para acessar os valores nas listas. Coloque e execute TwinkleTwinkle.bs2 Verifique se as notas soam como as da música “Brilha, Brilha Estrelinha” (“Twinkle Twinkle Little Star”). Use o DEBUG Terminal para verificar se funcionou como esperado. ' O que é um Microcontrolador - TwinkleTwinkle.bs2 ' Toque as sete primeiras notas de “Brilha, Brilha Estrelinha”. '{$STAMP BS2} '{$PBASIC 2.5} Notes DATA "C","C","G","G","A","A","G" Frequencies DATA Word 2093, Word 2093, Word 3136, Word 3136, Word 3520, Word 3520, Word 3136 Durations DATA Word 500, Word 500, Word 500, Word 500, Word 500, Word 500, Word 1000 index noteLetter VAR VAR Nib Byte Página - 211 noteFreq noteDuration VAR VAR Word Word PAUSE 1000 DEBUG "Nota "---- Duração ------- Frequência", CR, ----------", CR FOR index = 0 TO 6 READ Notes + index, noteLetter DEBUG " ", noteLetter READ Durations + (index * 2), Word noteDuration DEBUG " ", DEC4 noteDuration READ Frequencies + (index * 2), Word noteFreq DEBUG " ", DEC4 noteFreq, CR FREQOUT 9, noteDuration, noteFreq NEXT END Sua Vez – Adicionando e Reproduzindo Mais Notas Este programa reproduziu as sete primeiras notas de Brilha, Brilha Estrelinha. As palavras são "Bri-lha bri-lha es-tre-linha." A próxima frase da canção "Como eu quero saber o que você é" e suas notas são F, F, E, E, D, D, C . Tal como com a primeira frase, a última nota é reproduzida duas vezes, tão longas quanto às outras. Para adicionar esta frase para a música do TwinkleTwinkle.bs2, você vai precisar expandir cada diretiva DATA adequadamente. Não se esqueça de mudar o loop FOR...NEXT para que ele vá de 0-13 em vez de 0-6. Modifique TwinkleTwinkle.bs2 para que ele reproduza as duas primeiras frases da canção, e não somente a primeira. ATIVIDADE #4: MÚSICA COM MICROCONTROLADOR As durações das notas não são registradas na partitura em termos de milésimos de segundos. Em vez disso, são descritas como uma semibreve, mínima, semínima, colcheia, semicolcheia e trigésima segunda nota. Tal como o nome sugere uma nota dura metade do tempo de uma semibreve. A semínima dura um quarto do tempo de uma nota inteira, e assim por diante. Quanto tempo é uma semibreve? Depende da peça de música que está sendo executada. Uma peça pode ser tocada a um ritmo que faz com que uma semibreve dure por quatro segundos, outra peça pode ter uma semibreve por dois segundos, e ainda outra pode ter uma duração diferente. Pausa é o tempo entre as notas quando nenhum som é reproduzido. Períodos de pausa também são medidos com semibreve, mínima, semínima, colcheia, semicolcheia e trigésima segunda. Página - 212 Mais sobre música com microcontrolador: Após completar esta atividade, você estará pronto para aprender a escrever um código musical em PBASIC a partir da partitura. Consulte o tutorial reproduzindo a partitura com o Piezospeaker ( Playing Sheet Music with the Piezospeaker) e o manual em vídeo que acompanha em www.parallax.com/go/WAM. Um Sistema Melhor para Armazenar e Recuperar Músicas Você pode escrever programas que armazenam duas vezes mais músicas em seu BASIC Stamp usando bytes em vez de palavras em suas diretivas DATA. Você também pode modificar o seu programa para tornar mais fácil a leitura das notas musicais usando algumas das convenções musicais mais comuns para as notas e durações. Esta atividade começará com a introdução de como armazenar informações musicais de uma forma que se relaciona com os conceitos de notas, durações e pausas. O ritmo também é introduzido, e ele vai ser revisto na próxima atividade. Aqui está uma das diretivas DATA que armazena as notas musicais e as durações para o próximo programa de exemplo. Quando tocada, ela deve parecer com a canção "Frère Jacques". Somente os caracteres de notas são armazenados na diretiva Notes DATA porque os comandos LOOKUP e LOOKDOWN serão usados para combinar as letras para as suas correspondentes frequências. Notes DATA "C","D","E","C","C","D","E","C","E","F", "G","E","F","G","Q" Durations WholeNote DATA CON 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 2 4, 4, 4, 2000 O primeiro número da diretiva Durations DATA diz ao programa por quanto tempo a primeira nota na diretiva notes DATA deve durar. A segunda é para a duração da segunda nota, e assim por diante. As durações não estão mais em termos de milésimos de segundos. Em vez disso, eles são números muito menores que podem ser armazenados em bytes, por isso não há prefixo Word na diretiva DATA. Comparando com o armazenamento dos valores em termos de milésimos de segundos, esses números estão mais próximos dos relacionados com as partituras. Aqui está uma lista do que cada duração significa. • 1 – semibreve • 2 – mínima • 4 – semínima • 8 – colcheia • 16 – semicolcheia • 32 – trigésima segunda nota Depois que cada valor for lido a partir de diretiva Durations DATA ele é dividido pelo valor da semibreve para obter a diretiva Durations utilizada no comando FREQOUT. A quantidade de tempo de cada nota dura depende do ritmo da música. Um ritmo mais rápido significa que cada nota dura menos tempo, enquanto um ritmo mais Página - 213 lento significa que cada nota dura mais tempo. Uma vez que todas as durações de nota são frações de uma semibreve, você pode usar a duração de uma nota inteira para definir o ritmo. O que significa o "Q" em Notes DATA? O "Q" é para sair, e DO UNTIL...LOOP verifica a existência de um "Q" de cada vez através do loop e se repetirá até que ele seja encontrado. Como faço para executar uma pausa? Você pode inserir uma pausa entre as notas através da inserção de um "P". Na seção Sua Vez você tem as primeiras notas da 5ª Sinfonia de Beethoven, com uma pausa. Como faço para executar sustenidos/bemóis? NotesAndDurations.bs2 tem valores nas suas tabelas de referência para sustenidos/bemóis. Para tocar um bemol você usará a nota minúscula. Por exemplo, se você quiser tocar B-bemol, use "b" em vez de "B". Lembre-se que esta é a mesma frequência para Asustenido. Exemplo de Programa: NotesAndDurations.bs2 Coloque e execute NotesAndDurations.bs2. Como é o som? ' O que é um Microcontrolador - NotesAndDurations.bs2 ' Toque as primeiras notas de Frere Jacques. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Programa funcionando!" Notes DATA "C","D","E","C","C","D","E","C","E","F", "G","E","F","G","Q" Durations DATA WholeNote CON 2000 index offset VAR VAR Byte Nib noteLetter noteFreq noteDuration VAR VAR VAR Byte Word Word 4, 2, 4, 4, 4, 4, 4, 2 4, 4, 4, 4, 4, DO UNTIL noteLetter = "Q" READ Notes + index, noteLetter LOOKDOWN noteLetter, [ LOOKUP offset, "A", "D", "G", "b", "e", "a", "B", "E", "P", "C", "F", "Q" "d", "g", ], offset [ 1760, 1865, 1976, 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 0, 0 ], noteFreq READ Durations + index, noteDuration 4, Página - 214 noteDuration = WholeNote / noteDuration FREQOUT 9, noteDuration, noteFreq index = index + 1 LOOP END Como Funciona NotesAndDurations.bs2 Notes e as diretivas Durations DATA foram discutidas anteriomente no programa. Estas diretivas combinadas com a constante WholeNote são usadas para armazenar todos os dados musicais utilizados pelo programa. As declarações para as cinco variáveis usadas no programa são mostradas abaixo. Mesmo que um loop FOR...NEXT não seja mais usado para acessar os dados, ainda deve haver uma variável (index) para manter o controle de qual DATA de entrada está sendo lida em Notes e Durations. A variável de deslocamento é usada nos comandos LOOKDOWN e LOOKUP para selecionar um determinado valor. A variável noteLetter armazena um caractere acessado pelo comando READ. Os comandos LOOKUP e LOOKDOWN são usados para converter este caractere em um valor de frequência. Este valor é armazenado na variável noteFreq e é usado como o argumento Freq1 do comando FREQOUT. A variável noteDuration é usada em um comando READ para receber um valor a partir de Durations DATA. É também utilizada para calcular o argumento Duration para o comando FREQOUT. index offset VAR VAR Byte Nib noteLetter noteFreq noteDuration VAR VAR VAR Byte Word Word O loop principal continua a execução até que a letra "Q" seja lida a partir das Notes DATA. DO UNTIL noteLetter = "Q" Um comando READ recebe um caractere a partir de Notes DATA e o armazena na variável noteLetter. A variável noteLetter é então utilizada em um comando LOOKDOWN para definir o valor da variável de deslocamento. Lembre-se que o offset armazena 1 se "b" for detectado, um 2 se "B" for detectado, um 3 se "C" for detectado, e assim por diante. Este valor de deslocamento é então utilizado em um comando LOOKUP para descobrir qual deveria ser o valor da variável noteFreq. Se o deslocamento é 1, noteFreq será 1865, se o deslocamento é 2, noteFreq será 1976, se 3, noteFreq será 2093, e assim por diante. READ Notes + index, noteLetter LOOKDOWN noteLetter, [ "A", "b", "B", "C", "d", Página - 215 "D", "G", LOOKUP offset, "e", "a", "E", "P", "F", "g", "Q" ], offset [ 1760, 1865, 1976, 2093, 2217, 2349, 2489, 2637, 2794, 2960, 3136, 3322, 0, 0 ], noteFreq A frequência da nota foi determinada, mas a duração ainda tem que ser. O comando READ usa o valor do índice para colocar um valor a partir de Durations DATA em noteDuration. READ Durations + index, noteDuration Então, noteDuration é definido igual a constante WholeNote dividida por noteDuration. Se noteDuration começar como 4 a partir de um comando READ, será 2000 ÷ 4 = 500. Se noteDuration para 8, será 2000 ÷ 8 = 250. noteDuration = WholeNote / noteDuration Agora que noteDuration e noteFreq já estão determinados, o comando FREQOUT reproduz a nota. FREQOUT 9, noteDuration, noteFreq Cada vez através do loop principal, o valor index será aumentado em um. Quando o loop principal retornar ao início, a primeira coisa que o programa fará é ler a nota seguinte, usando a variável index. index = index + 1 LOOP Sua Vez – Experiências com Ritmo e uma Música Diferente A duração de cada nota está relacionada ao ritmo. Você pode alterar o ritmo, ajustando a constante WholeNote. Se você aumentar para 2250, o ritmo vai diminuir, e a música será mais lenta. Se você diminuir a 1750, o ritmo vai aumentar e a música será mais rápida. Salve NotesAndDurations.bs2 sob o nome NotesAndDurationsYourTurn.bs2. Modifique o ritmo de NotesAndDurationsYourTurn.bs2 ajustando o valor de WholeNote. Experimente valores de 1500, 1750, 2000 e 2250. Execute novamente o programa depois de cada modificação, e decida qual deles soa melhor. A inserção de dados musicais é muito mais fácil quando tudo que você tem a fazer é gravar notas e durações. Aqui estão as primeiras oito notas da Quinta Sinfonia de Beethoven. Notes Durations DATA DATA WholeNote CON "G","G","G","e","P","F","F","F","D","Q" 8, 2000 8, 8, 2, 8, 8, 8, 8, 2 Página - 216 Salve o programa modificado como Beethoven'sFifth.bs2. Substitua Notes as diretivas Durations DATA e a declaração constante WholeNote pelo código acima. Execute o programa. Soa familiar? Adicionando Recursos Musicais O programa de exemplo que você finalizou introduziu notas, durações e pausas. Foi também usada a duração de semibreves para determinar o ritmo. Aqui estão mais três recursos que podem ser adicionados a um programa de reprodução de música. • • • Toque notas "pontilhadas" Determine a duração de uma semibreve a partir do ritmo. Toque as notas uma oitava acima. O termo pontilhado refere-se a um ponto usado em partituras para indicar que o tempo de duração de uma nota deverá ser uma vez e meia maior que sua duração normal. Por exemplo, uma semínima pontilhada deve durar uma semínima e uma colcheia. A mínima pontilhada dura uma mínima mais a duração de uma semínima. Você pode adicionar uma tabela de dados que armazena notas pontilhadas ou não. Neste exemplo, um zero significa que não há um ponto enquanto um significa que existe um ponto. Dots DATA 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0 0, 0, 0, 0, Os programas de reprodução de música expressam o ritmo de uma canção em batimentos por minuto. Isto é o mesmo que dizer semínimas por minuto. BeatsPerMin CON 200 A Figura 8-4 é uma repetição da Figura 8-3 da página 207. Ela mostra as sextas e sétimas oitavas no teclado de piano. Estas são as duas oitavas em que o som fica mais claro quando desempenhado pelo piezospeaker. Aqui está um exemplo de uma diretiva DATA que você vai usar na sua seção Sua Vez para tocar as notas uma oitava acima usando a diretiva Notes DATA. Octaves DATA 6, 7, 6, 6, 6, 6, 6, 6, 6 6, 6, 6, 7, 6, Página - 217 Figura 8-4: Teclas de piano à direita e suas frequências Exemplo de Programa: MusicWithMoreFeatures.bs2 Este programa exemplo reproduz as primeiras notas de "Ele é um bom companheiro". Todas as notas vêm da mesma (sétima) oitava, mas algumas das notas são pontilhadas. Na seção Sua Vez, você vai tentar um exemplo que usa notas de mais de uma oitava, e notas pontilhadas. Coloque e execute MusicWithMoreFeatures.bs2. Conte as notas e veja se você pode ouvir as notas pontilhadas de 1 ½ de duração. Escute também as notas em sétima oitava. Tente alterar uma dessas notas para sexta oitava. A mudança na forma como a música soa é muito drástica. ' O que é um Microcontrolador - MusicWithMoreFeatures.bs2 ' Toca o início de “Ele é um bom companheiro”. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Programa funcionando!" Notes DATA "C","E","E","E","D","E","F","E","E","D","D", "D","C","D","E","C","Q" 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 4, 2, 4, 4, 4, 4, 2, 2, 4, 2, 4, 4, 4, 4, 2, 2 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 Octaves DATA Durations DATA Dots DATA BeatsPerMin CON 320 index offset VAR VAR Byte Nib Página - 218 noteLetter noteFreq noteDuration noteOctave noteDot VAR VAR VAR VAR VAR Byte Word Word Nib Bit wholeNote VAR Word wholeNote = 60000 / BeatsPerMin * 4 DO UNTIL noteLetter = "Q" READ Notes + index, noteLetter LOOKDOWN noteLetter, LOOKUP offset, [ "C", "F", "b", "d", "g", "B", "D", "G", "P", "e", "a", "Q" "E", "A", ], offset [ 4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902, 0, 0 ], noteFreq READ Octaves + index, noteOctave noteOctave = 8 - noteOctave noteFreq = noteFreq / (DCD noteOctave) READ Durations + index, noteDuration noteDuration = WholeNote / noteDuration READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2 FREQOUT 9, noteDuration, noteFreq index = index + 1 LOOP END Como Funciona MusicWithMoreFeatures.bs2 Abaixo estão os dados musicais para a canção inteira. Para cada nota na diretiva Notes DATA, há uma entrada correspondente nas diretivas Octaves, Notes, Durations e Dots DATA. Por exemplo, a primeira nota é uma nota C na sétima oitava, é uma semínima e não é pontilhada. Aqui está outro exemplo: a segunda a partir da última nota (não incluindo o "Q") é uma nota E, na sétima oitava. É uma mínima, e é pontilhada. Há também uma constante BeatsPerMin que define o ritmo para a música. Notes DATA "C","E","E","E","D","E","F","E","E","D","D", "D","C","D","E","C","Q" Octaves DATA 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 Durations DATA 4, 2, 4, 4, 4, 4, 2, 2, 4, 2, 4, 4, 4, 4, 2, 2 Dots DATA 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0 BeatsPerMin CON 320 Página - 219 No programa do exemplo anterior, a semíbreve foi uma constante. Desta vez, é uma variável que vai manter a duração da semínima em ms. Depois que este valor for calculado, a semibreve será usada para determinar todas as outras durações das notas, assim como no programa anterior. As variáveis index, offset, noteLetter e noteDuration também são usadas da mesma maneira que estavam no programa anterior. A variável noteFreq é tratada um pouco diferente já que agora ela tem de ser ajustada dependendo da oitava nota que está sendo executada. As variáveis noteOctave e noteDot foram adicionadas para lidar com as características de uma oitava e ponto. wholeNote VAR Word index offset VAR VAR Byte Nib noteLetter noteFreq noteDuration noteOctave noteDot VAR VAR VAR VAR VAR Byte Word Word Nib Bit A variável wholeNote é calculada usando BeatsPerMin. O ritmo da música é definido em batimentos por minuto, e o programa tem que dividir BeatsPerMin em 60000 ms, em seguida, multiplicar por 4. O resultado é o valor correto para uma semibreve. wholeNote = 60000 / BeatsPerMin * 4 O cálculo é feito da esquerda para a direita. No cálculo wholeNote = 60000 / beatsPerMin * 4, o BASIC Stamp primeiro calcula 60000 / beatsPerMin. Em seguida, ele multiplica esse resultado por 4. Para um grupo de operações podem ser usados parênteses. Se você quiser dividir quatro em beatsPerMin, primeiro você tem que fazer isso: wholeNote = 60000 / (beatsPerMin * 4) É o mesmo que o do programa anterior: DO UNTIL noteLetter = "Q" READ Notes + index, noteLetter LOOKDOWN noteLetter, [ "C", "F", "b", "d", "g", "B", "D", "G", "P", "e", "a", "Q" "E", "A", ], offset Agora que as oitavas estão misturadas a parte do código que estabelece a frequência da nota mudou. A tabela de valores do comando LOOKUP contém as frequências das notas a partir das oitavas da oitava. Estes valores podem ser divididos por um, se você quiser Página - 220 tocar notas oitavas na oitava, com 2 se você quiser tocar notas na sétima oitava, com 4 se você quiser tocar notas na sexta oitava e com 8 se você quiser tocar as notas na quinta oitava. A divisão acontece em seguida. Tudo o que esse comando LOOKUP faz é colocar uma nota a partir da oitava na oitava na variável noteFreq. LOOKUP offset, [ 4186, 4435, 4699, 4978, 5274, 5588, 5920, 6272, 6645, 7040, 7459, 7902, 0, 0 ], noteFreq Aqui está como a variável noteFreq é ajustada para a oitava correta. Primeiro, o comando READ pega o valor da oitava armazenada nas Octaves DATA. Este poderia ser um valor entre 5 e 8. READ Octaves + index, noteOctave Dependendo da oitava, queremos dividir noteFreq por 1, 2, 4 ou 8. Isso significa que o objetivo é realmente dividir por 20 = 1, 21 = 2, 22 = 4, ou 23 = 8. A declaração abaixo pega o valor de noteOctave, que pode ser um valor entre 5 e 8, e subtrai esse valor a partir de 8. Se noteOctave era 8 agora é 0. Se noteOctave era 7 agora é 1. Se noteOctave era 6 agora é 2, e se noteOctave era 5 agora é 3. noteOctave = 8 – noteOctave Agora, noteOctave é um valor que pode ser usado como um expoente de 2, mas como se elevar 2 a uma potência em PBASIC? Uma resposta é a utilização do operador. DCD 0 é 1, DCD 1 é 2, DCD 2 é 4 e DCD 3 é 8. Dividir noteFreq por DCD noteOctave significa que você está dividindo por 1, 2, 4 ou 8, que divide noteFreq abaixo do valor correto. O resultado final é que noteFreq está definido para a oitava correta. Você usará o DEBUG Terminal na seção Sua Vez para dar uma olhada em como isso funciona. noteFreq = noteFreq / (DCD noteOctave) Como vou saber usar o operador DCD? Continue aprendendo e praticando. Toda vez que você ver um novo comando, operador ou qualquer outra palavrachave usada em um exemplo, procure-o no manual do BASIC Stamp. Leia mais sobre isso, e tente usá-lo em um programa do seu próprio projeto. Adquira o hábito de ler periodicamente o manual do BASIC Stamp e tente os programas de exemplo curtos. Essa é a melhor maneira de se familiarizar com os vários comandos e operadores e como eles funcionam. Ao fazer essas coisas, você vai desenvolver o hábito de sempre adicionar à lista de programação ferramentas que você pode usar para resolver os problemas. As duas primeiras linhas de código para determinar a duração da nota usa o mesmo código do programa de exemplo anterior. Agora, no entanto, toda a nota pode ser pontilhada, o que significa que a duração pode ter que ser multiplicada por 1,5. Um comando READ é utilizado para acessar valores armazenados na EEPROM pela diretiva Dots DATA. Uma IF...THEN é usada para multiplicar por 3 e dividir por dois sempre que o valor da variável noteDot for 1. READ Durations + index, noteDuration Página - 221 noteDuration = WholeNote / noteDuration READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2 Cálculo com números inteiros. O BASIC Stamp não processa automaticamente um número como 1,5. Ao realizar o cálculo, ele só funciona com inteiros: ..., -5, 4, -3, -2, -1, 0, 1, 2, 3, ... A melhor solução para multiplicar por 1,5 é multiplicar por 3/2 . Primeiro, multiplique por três e, em seguida, divida por 2. Há muitas maneiras de programar o BASIC Stamp para lidar com valores fracionários. Você pode programar o BASIC Stamp para usar números inteiros para descobrir a parte fracionária de um número. Isto é introduzido no Guia Básico Analógico e Digital do Etudante (Basic Analog and Digital Student Guide). Há também dois operadores que fazem valores fracionários ficarem mais fáceis de se usar, eles são: ** e */. Isto é explicado detalhadamente em Sensores Aplicados do Guia do Estudante (Applied Sensors Student Guide) no manual do BASIC Stamp. O restante deste exemplo de programa funciona da mesma maneira que no programa de exemplo anterior: FREQOUT 9, noteDuration, noteFreq index = index + 1 LOOP END Sua Vez – Execução de uma Canção com Mais de uma Oitava O MusicWithMoreFeatures.bs2 fez uso de pausas, mas pemaneceu em uma oitava. A música “Leve-me ao jogo de bola” (“Take Me Out to the Ball Game”) abaixo tem a maioria de suas notas na sexta oitava. Há duas notas na sétima oitava, e elas fazem uma grande diferença na maneira como soam. Salve uma cópia do programa como MusicWithMoreFeaturesYourTurn.bs2. Modifique o programa, substituindo as quatro diretivas de dados e uma declaração constante com estas: Notes DATA "C","C","A","G","E","G","D","P","C","C","A", "G","E","G","Q" Octaves DATA 6, 7, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6 Durations DATA 2, 4, 4, 4, 4, 2, 2, 4, 2, 4, 4, 4, 4, 2 Dots DATA 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1 BeatsPerMin CON 240 Execute o programa e verifique se ele soa bem. Página - 222 Essas duas notas na sétima oitava são essenciais para fazer uma boa melodia. É interessante ouvir o que acontece se os 7 valores são alterados para 6. Tente alterar os dois valores em 7 na diretiva Octaves DATA para que fiquem 6. Lembre-se que isso fará com um som estranho seja emitido em “Leve-me para o jogo de bola” ( “Take Me out to the Ball Game”). Execute o programa e ouça os efeitos errados das oitavas na música. Altere os dados das oitavas de volta para seu estado original. Execute o programa novamente e ouça para ver se soa correto. ATIVIDADE #5: TOQUES COM RTTTL Telefones celulares mais antigos usavam toques com um piezospeaker. Os toques eram baixados da web em um computador, e em seguida, carregados a partir do computador para o microcontrolador do telefone celular. Na época, uma das formas mais utilizadas para compor, gravar e postar toques foi a que apresentou trechos de texto com caracteres que descreviam cada nota da canção. Aqui está um exemplo de como as primeiras notas da 5ª de Beethoven aparece em um desses textos: Beethoven5:d=8,o=7,b=125:g,g,g,2d#,p,f,f,f,2d Este formato de armazenamento de dados musicais é chamado RTTTL, que significa “Linguagem de Tom de Toque para Transferência de Texto” (Ringing Tone Text Transfer Language). A grande coisa sobre os ficheiros RTTTL é que na época eles foram amplamente compartilhados através da Web. Muitos sites tinham arquivos RTTTL disponíveis para download gratuito. Havia também programas gratuitos que podiam ser usados para compor e emular esses arquivos, bem como enviá-los para seu telefone celular. A especificação RTTTL ainda é publicada online. O Apêndice C resume como um arquivo RTTTL armazena notas, durações, pausas, ritmo, e notas pontilhadas. Esta atividade introduz algumas técnicas de programação PBASIC que podem ser utilizadas para reconhecer diferentes elementos de texto. A capacidade de reconhecer diferentes caracteres ou grupos de caracteres e agir com base no que os caracteres contêm são extremamente úteis. Na verdade, é a chave para a conversão de um toque em formato RTTTL (como a 5ª de Beethoven acima) em música. Ao final desta atividade, há um programa de aplicação que você pode usar para reproduzir toque em formato RTTTL. Defina o Bloco de Código a Ser Executado Caso a Caso. A instrução SELECT...CASE é provavelmente a melhor ferramenta de programação para reconhecer caracteres ou valores. Tenha em mente que esta é uma das ferramentas mais usadas para converter um toque em formato RTTTL em notas musicais. Em geral, SELECT...CASE é usado para: • • Selecionar uma variável ou expressão. Avaliar a variável ou expressão caso a caso. Página - 223 • Executar diferentes blocos de código, dependendo do caso, e do o valor em que a variável se encaixa. Aqui está a sintaxe SELECT...CASE: SELECT expression CASE condition(s) statement(s) { CASE ELSE Statement(s) } ENDSELECT Você pode tentar os próximos dois exemplos de programas para ver como SELECT...CASE funciona. SelectCaseWithValues.bs2 leva valores numéricos inseridos no DEBUG Terminal e diz-lhe o tamanho mínimo da variável que você vai precisar para realizar esse valor. SelectCaseWithCharacters.bs2 informa se o caractere que você entrou no DEBUG Terminal é maiúsculo ou minúsculo, um dígito, ou pontuação. Lembre-se de usar a janela de transmissão no DEBUG Terminal para enviar os caracteres digitados para o BASIC Stamp. As janelas de transmissão e recepção são mostradas na Figura 8-5. Figura 8-5 Envio de mensagens para o BASIC Stamp Janela de Transmissão Transmite → Clique na janela de transmissão (superior) e digite o valor ou os caracteres que você quer transmitir para o BASIC Stamp. Recebe → Exemplo de Programa: SelectCaseWithValues.bs2 Coloque e execute SelectCaseWithValues.bs2. No DEBUG Terminal, certifique-se de que a caixa Echo off não esteja marcada. Clique na janela de transmissão do DEBUG Terminal. Insira um valor entre 0 e 65535, e pressione a tecla Enter. O que acontece se você digitar um número maior do que 65535? Se você digitar o número 65536, o BASIC Stamp irá armazenar o número 0. Se você digitar o número 65537, o BASIC Stamp irá armazenar o número 1 e assim por diante. Quando um número é muito grande para a variável que se encaixa, ele é chamado de overflow. Use a Tabela 8- 1 para verificar se o programa de exemplo tomou as decisões corretas sobre o tamanho dos números que você entrou no DEBUG Terminal. Tabela 8-1: Tipos de variáveis e valores que podem ser armazenados Tipo de variável Faixa de valores Bit 0 para 1 Página - 224 Nib Byte Word 0 para 15 0 para 255 0 para 65535 ' O que é um Microcontrolador - SelectCaseWithValues.bs2 ' Informe um valor e veja o tamanho mínimo da variável necessário para ' mantê-la. '{$STAMP BS2} '{$PBASIC 2.5} value PAUSE 1000 VAR Word DEBUG "Informe um valor de", CR, "0 à 65535: " DO DEBUGIN DEC value SELECT value CASE 0, 1 DEBUG "Bit", CR PAUSE 100 CASE 2 TO 15 DEBUG "Nib (Nibble)", CR PAUSE 200 CASE 16 TO 255 DEBUG "Byte", CR PAUSE 300 CASE 256 TO 65535 DEBUG "Word", CR PAUSE 400 ENDSELECT DEBUG CR, "Informe outro valor: " LOOP Como Funciona SelectCaseWithValues.bs2 A palavra variável é declarada para manter os valores inseridos no DEBUG Terminal. value VAR Word O comando DEBUGIN leva o número digitado e o coloca na variável value. DEBUGIN DEC value A instrução SELECT escolhe a variável value como a única para avaliar estes casos. SELECT value Página - 225 O primeiro caso é se a variável value for igual a 0 ou 1. Se o valor for igual a qualquer um desses números, os comandos DEBUG e PAUSE que seguem serão executados. CASE 0, 1 DEBUG "BIT", CR PAUSE 100 O segundo caso é, se o valor for igual a qualquer número de 2 a 15. Se ele for igual a qualquer um desses números, os comandos DEBUG e PAUSE abaixo serão executados. CASE 2 to 15 DEBUG "NIB (Nibble)", CR PAUSE 200 Quando todos os casos forem resolvidos, a palavra-chave ENDSELECT será usada para completar a instrução SELECT...CASE. ENDSELECT Programa de Exemplo: SelectCaseWithCharacters.bs2 Este programa de exemplo avalia cada caractere que você digitou na janela de transmissão do DEBUG Terminal. Ele pode reconhecer caracteres maiúsculos e minúsculos, números e alguns sinais de pontuação. Se você digitar um caractere, que o programa não reconhece, ele irá lhe dizer para tentar novamente (entrando com caractere diferente). Coloque e execute SelectCaseWithCharacters.bs2. Verifique se a caixa de seleção Echo Off não está marcada. Clique na janela de transmissão do DEBUG Terminal para colocar o cursor lá. Digite os caracteres na janela de transmissão e observe os resultados. ' O que é um Microcontrolador - SelectCaseWithCharacters.bs2 ' Programa é capaz de identificar alguns caracteres: caixa, dígito, ' pontuação. '{$STAMP BS2} '{$PBASIC 2.5} character PAUSE 1000 VAR Byte DEBUG "Informe um caractere: ", CR DO DEBUGIN character SELECT character CASE "A" TO "Z" DEBUG CR, "Caixa alta", CR CASE "a" TO "z" DEBUG CR, "Caixa baixa", CR Página - 226 CASE "0" TO "9" DEBUG CR, "Dígito", CR CASE "!", "?", ".", "," DEBUG CR, "Pontuação", CR CASE ELSE DEBUG CR, "Caractere desconhecido.", CR, "Tente um diferente." ENDSELECT DEBUG CR, "Informe outro caractere", CR LOOP Como Funciona SelectCaseWithCharacters.bs2 Quando comparado com SelectCaseWithValues.bs2, este programa de exemplo tem algumas diferenças. Em primeiro lugar, o nome da variável de valor foi mudado para caractere, e o seu tamanho foi alterado de word para byte. Isso ocorre porque todos os caracteres em PBASIC são de tamanho byte. A instrução SELECT escolhe a variável de caracteres para avaliação caso-a-caso. SELECT character As aspas são usadas para dizer ao BASIC Stamp Editor que você está se referindo aos caracteres. Podemos tratar dos seguintes grupos de caracteres e sinais de pontuação da mesma forma que uma série de números, uma vez que o BASIC Stamp reconhece-os pelo seu ASCII numérico equivalente veja a tabela ASCII no BASIC Stamp Editor. SELECT character CASE "A" TO "Z" DEBUG CR, "Caixa alta", CR CASE "a" TO "z" DEBUG CR, "Caixa baixa", CR CASE "0" TO "9" DEBUG CR, "Dígito", CR CASE "!", "?", ".", "," DEBUG CR, "Pontuação", CR Há também uma declaração CASE diferente que não foi utilizada no exemplo anterior: CASE ELSE DEBUG CR, "Caractere desconhecido.", CR, "Tente um diferente." Esta declaração CASE diz ao bloco de código o que fazer se nenhum dos outros casos for verdadeiro. Você pode obter este caso que funciona com a entrada de um caractere, como % ou $. Página - 227 Sua Vez – Selecionando Caracteres Especiais Modifique a instrução SELECT...CASE no SelectCaseWithCharacters.bs2 para que ele exiba um “caractere especial” quando você entrar com um desses caracteres: @, #, $, %, ’^’ , &, *, (, ), _, ou +. Programa de Aplicação de Toques RTTTL Abaixo está o arquivo RTTTL que contém a informação musical usada no próximo programa de exemplo. Existe mais cinco diretivas RTTTL_File DATA que você pode tentar na seção Sua Vez. Este programa toca uma música chamada Reveille, que é o toque de clarim usado em acampamentos militares ao amanhecer . Você pode ter ouvido isso em inúmeros filmes ou programas de televisão. RTTTL_File DATA "Reveille:d=4,o=7,b=140:8g6,8c,16e,16c,8g6,8e,", "8c,16e,16c,8g6,8e,8c,16e,16c,8a6,8c,e,8c,8g6,", "8c,16e,16c,8g6,8e,8c,16e,16c,8g6,8e,8c,16e,", "16c,8g6,8e,c,p,8e,8e,8e,8e,g,8e,8c,8e,8c,8e,8c,", "e,8c,8e,8e,8e,8e,8e,g,8e,8c,8e,8c,8g6,8g6,c." Exemplo de Programa: MicroMusicWithRtttl.bs2 Este aplicativo é muito longo, e é uma boa idéia fazer o download da versão mais recente na www.parallax.com/gopage/WAM. Baixar o programa e abri-lo com o BASIC Stamp Editor deve poupar uma quantidade significativa de tempo. A alternativa, claro, é dar um enter manualmente e depurar quatro páginas de código. Com o BASIC Stamp Editor, abra o arquivo baixado MicroMusicWithRtttl.bs2, ou manualmente insira o exemplo abaixo cuidadosamente. Execute o programa e verifique se o som é reconhecido como o clarim de Reveille. Vá para a seção Sua Vez e tente mais alguns toques (diretivas RTTTL_File DATA). ' O que é um Microcontrolador - MicroMusicWithRtttl.bs2 ' Toque o ringtone da Nokia no format RTTTL usando DATA. '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Programa funcionando!" ' -----[ I/O Definitions ]-------------------------------------------SpeakerPin PIN 9 ' Piezospeaker conectado à P9. ' -----[ Variables ]-------------------------------------------------counter char VAR VAR Word Byte ' Contador de propósito geral. ' Variável armazena caracteres. Página - 228 index VAR Word ' Índice para apontas dados. noteLetter noteFreq noteOctave VAR VAR VAR Byte Word Word ' Armazena caracteres da nota. ' Armazena frequência da nota. ' Armazena oitava da nota. duration tempo VAR VAR Word Word ' Armazena duração da nota. ' Armazena ritmo. default_d default_o default_b VAR VAR VAR Byte Byte Word ' Armazena duração padrão. ' Armazena oitava padrão. ' Armazena batidas/min padrão. ' -----[ EEPROM Data ]-----------------------------------------------RTTTL_File DATA "Reveille:d=4,o=7,b=140:8g6,8c,16e,16c,8g6,8e,", "8c,16e,16c,8g6,8e,8c,16e,16c,8a6,8c,e,8c,8g6,", "8c,16e,16c,8g6,8e,8c,16e,16c,8g6,8e,8c,16e,", "16c,8g6,8e,c,p,8e,8e,8e,8e,g,8e,8c,8e,8c,8e,8c,", "e,8c,8e,8e,8e,8e,8e,g,8e,8c,8e,8c,8g6,8g6,c." Done DATA ",q," Notes DATA Octave8 DATA "p", "a", "#", "b", "c", "#", "d", "#", "e", "f", "#", "g", "#" Word 0, Word 3520, Word 3729, Word 3951, Word 4186, Word 4435, Word 4699, Word 4978, Word 5274, Word 5588, Word 5920, Word 6272, Word 6645 ' -----[ Initialization ]--------------------------------------------counter = 0 ' Inicializa contador. GOSUB GOSUB GOSUB GOSUB GOSUB GOSUB ' ' ' ' ' ' FindEquals ProcessDuration FindEquals ProcessOctave FindEquals GetTempo Encontra primeiro '=' no arq. Obtém duração padrão. Encontra próximo '='. Obtém oitava padrão. Encontra último '='. Obtém ritmo padrão. ' -----[ Program Code ]----------------------------------------------DO UNTIL char = "q" GOSUB ProcessDuration GOSUB ProcessNote GOSUB CheckForDot GOSUB ProcessOctave GOSUB PlayNote LOOP END ' Loop até 'q' em DATA. ' Obtém duração da nota. ' Obtém valor do índice da nota. ' Se dot, 3/2 duração. ' Obtém oitava. ' Obtém freq, toca nota, próx. ' Fim do loop principal. ' Fim do programa. ' -----[ Subroutine - Find Equals Character ]------------------------- Página - 229 FindEquals: DO READ RTTTL_File + counter, char counter = counter + 1 LOOP UNTIL char = "=" ' ' ' ' Busca por '=' através dos caracteres no arq RTTTL. Incrementa contador até achar '=', então, retorna. RETURN ' ' ' ' ' ' ' -----[ Subroutine - Read Tempo from RTTTL Header ]-----------------Cada caractere do teclado tem um número único chamado valor ASCII. Os caracteres 0, 1, 2,..., 9 possuem valores ASCII de 48, 49, 50, ..., 57. Você pode sempre converter do caractere representando um dígito para o seu valor subtraundo 48 da variável que armazena o dígito. Você pode examinar isso comparando DEC 49 e DEBUG 49. GetTempo: ' Analisa arq RTTTL para ritmo. ' Converte caracteres para default_b = 0 ' dígitos subtraindo 48 DO ' de cada valor ASCII do READ RTTTL_File + counter, char ' caractere. Iterativamente IF char = ":" THEN ' multiplica cada dígito por 10 default_b = default_b / 10 ' se houver outro dígito, então counter = counter + 1 ' adiciona o ultimo dígito à EXIT ' uma coluna. ENDIF ' Por exemplo, a sequência default_b = default_b + char - 48 ' "120" é (1 X 10 X 10) counter = counter + 1 ' + (2 X 10) + 0. O '1' default_b = default_b * 10 ' é convertido primeiro, então LOOP UNTIL char = ":" ' multiplicado por 10. O '2' ' é então convertido/adicionado. RETURN ' 0 é convertido/adicionado, fim ' -----[ Subroutine - Look up Octave ]-------------------------------ProcessOctave: READ RTTTL_File + counter, char SELECT char CASE "5" TO "8" noteOctave = char - "0" counter = counter + 1 CASE ELSE noteOctave = default_o ENDSELECT IF default_o = 0 THEN default_o = noteOctave ENDIF RETURN ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' Oitava pode ou não ser incluída em dada nota porque qualquer nota que é tocada na oitava padrão não especifica a oitava. Se um caractere de '5' a '8' então a usa, ELSE usa default_o. Caracteres são convertidos para dígitos subtraindo '0', que é o mesmo que subtrair 48. A primeira vez que essa sub-rotina é chamada, default_o é 0. Se 0, então define default_o. ' -----[ Subroutine - Find Index of Note ]---------------------------ProcessNote: READ RTTTL_File + counter, char SELECT char CASE "p" index = 0 ' ' ' ' ' Define valor do índice para busca da freq da nota baseada no caractere da nota. Se 'p', o índice é 0. Se 'a' à 'g', lê os valores dos caracteres ' na tabela DATA e encontra com- Página - 230 counter = counter + 1 CASE "a" TO "g" ' binação. Grava valor do índi' ce quando a combinação é ' encontrada, caractere éum FOR index = 1 TO 12 ' sustenido (#), adiciona READ Notes + index, noteLetter ' 1 ao valor do índice para IF noteLetter = char THEN EXIT ' aumentar o índice (e NEXT ' frequência) por 1 nível. counter = counter + 1 ' Como em outras sub-rotinas, READ RTTTL_File + counter, char ' o contador de increment para SELECT char ' caracteres é o processado. CASE "#" index = index + 1 counter = counter + 1 ENDSELECT ENDSELECT RETURN ' -----[ Subroutine - Determine Note Duration ]----------------------ProcessDuration: ' Verifica se a forma dos chars ' é 1, 2, 4, 8, 16 ou 32. READ RTTTL_File + counter, char ' Se sim, então converte do ' caractere ASCII para um valor SELECT char ' subtraindo 48. Se for o caso CASE "1", "2", "3", "4", "8" ' de 16 ou 32, multiplica duration = char - 48 ' por 10 e adiciona o próximo counter = counter + 1 ' dígito à colunas de “uns”. READ RTTTL_File + counter, char SELECT char CASE "6", "2" duration = duration * 10 + char - 48 counter = counter + 1 ENDSELECT CASE ELSE ' Se não houver duração, usa duration = default_d ' a padrão. ENDSELECT IF default_d <> 0 THEN ' Se default_d não é definida duration = 60000/default_b/duration*3 '(if default_d = 0), então ELSE ' define default_d = para a default_d = duration ' duração de d=#. ENDIF RETURN ' -----[ Subroutine - Check For '.' Indicating 1.5 Duration ]--------CheckForDot: READ RTTTL_File + counter, char SELECT char CASE "." duration = duration * 3 / 2 counter = counter + 1 ENDSELECT ' Verifica indicação de dots mul ' tiplicando a duração por 3/2. ' Se encontra dor, multiplica ' por 3/2 e incrementa contador, ' se não, não faz nada e ' retorna. RETURN ' -----[ Subroutine - Find Comma and Play Note/Duration ]------------- Página - 231 PlayNote: ' ' ' ' ' Encontra últma vírgula na entrada da nota atual. Então, busca a frequência da nota no data, e a toca, ou pausa, se a frequência for = 0. READ RTTTL_File + counter, char SELECT char CASE "," counter = counter + 1 READ Octave8 + (index * 2), Word noteFreq noteOctave = 8 - noteOctave noteFreq = noteFreq / (DCD noteOctave) IF noteFreq = 0 THEN PAUSE duration ELSE FREQOUT SpeakerPin, duration, noteFreq ENDIF ENDSELECT RETURN Como Funciona MicroMusicWithRtttl.bs2 Este programa de exemplo é divertido de usar, ele mostra o tipo de código que você será capaz de escrever com um pouco de prática. No entanto, ele foi incluído neste texto mais por diversão do que para os conceitos de codificação que emprega. Se você examinar o código brevemente, você pode notar que você já usou todos os comandos e operadores do programa, exceto um! Aqui está uma lista dos elementos que esse programa usa, eles, agora, já devem ser bem familiares: • Comentários para ajudar a explicar o seu código; • Declarações constantes e variáveis; • Declarações DATA; • Comandos READ; • Blocos IF...ELSE...ENDIF; • DO...LOOP com ou sem WHILE e UNTIL; • Sub-rotinas com GOSUB, rótulos, e RETURN; • Loops FOR...NEXT; • Comandos LOOKUP e LOOKDOWN; • Comandos FREQOUT e PAUSE; • Comandos SELECT...CASE; • EXIT é novo, mas simplesmente permite que o programa "saia" um loop antes de terminar. É frequentemente usado em declaraçaões IF...THEN. Sua Vez - Toques Diferentes Tente substituir a diretiva RTTTL_File DATA em MicroMusicWithRTTTL.bs2 com cada um dos cinco arquivos de música diferentes abaixo. Apenas uma diretiva RTTTL_File DATA de cada vez! Certifique-se de substituir, e não adicionar a sua nova directiva RTTTL_File DATA. Execute MicroMusicWithRTTTL.bs2 para testar cada arquivo RTTTL. Página - 232 RTTTL_File DATA "TwinkleTwinkle:d=4,o=7,b=120:c,c,g,g,a,a,2g,f,", "f,e,e,d,d,2c,g,g,f,f,e,e,2d,g,g,f,f,e,e,2d,c,c,", "g,g,a,a,2g,f,f,e,e,d,d,1c" RTTTL_File DATA "FrereJacques:d=4,o=7,b=125:c,d,e,c,c,d,e,c,e,f", ",2g,e,f,2g,8g,8a,8g,8f,e,c,8g,8a,8g,8f,e,c,c,g6", ",2c,c,g6,2c" RTTTL_File DATA "Beethoven5:d=8,o=7,b=125:g,g,g,2d#,p,f,f,f,2d" RTTTL_File DATA "ForHe'sAJollyGoodFellow:d=4,o=7,b=320:c,2e,e,e,", "d,e,2f.,2e,e,2d,d,d,c,d,2e.,2c,d,2e,e,e,d,e,2f,", "g,2a,a,g,g,g,2f,d,2c" RTTTL_File DATA "TakeMeOutToTheBallgame:d=4,o=7,b=225:2c6,c,a6,", "g6,e6,2g.6,2d6,p,2c6,c,a6,g6,e6,2g.6,g6,p,p,a6", ",g#6,a6,e6,f6,g6,a6,p,f6,2d6,p,2a6,a6,a6,b6,c,", "d,b6,a6,g6" Baixando arquivos RTTTL: Há arquivos RTTTL disponíveis para download a partir de diversos sites na internet. Esses arquivos são fornecidos pelos entusiastas de toques de celular, muitos dos quais não são especialistas em música. Alguns tons de telefone são muito bons, outros são quase irreconhecíveis. Se você quiser baixar e executar alguns arquivos RTTTL, certifique-se de remover os espaços entre caracteres, em seguida, insira o arquivo de texto entre aspas. SUMÁRIO Este capítulo introduziu técnicas para fazer sons e tons musicais com o BASIC Stamp e um alto-falante piezoelétrico. O comando FREQOUT pode ser usado para enviar para um alto-falante piezoelétrico sinais de alta/baixa que provocam efeitos sonoros e/ou notas musicais. O comando FREQOUT tem argumentos que controlam o sinal do pino de I/O enviado para a duração do tom, e a frequência do som (Freq1). O argumento opcional Freq2 pode ser usado para tocar duas notas de uma só vez. Os efeitos sonoros podem ser feitos ajustando a frequência e duração dos tons e as pausas entre eles. O valor da frequência também pode ser varrido através de uma gama de valores para criar uma variedade de efeitos. Fazer notas musicais depende também de frequência, duração e pausas. O valor do argumento Duration do comando FREQOUT é determinado pelo ritmo da música e da duração da nota (semibreve, mínima, semínima etc.) O valor Freq1 da nota é Página - 233 determinado por letra da nota e oitava. As pausas entre as notas são usadas para definir a duração do comando PAUSE. A reprodução de músicas simples pode ser feita usando o comando FREQOUT, mas existem maneiras melhores de armazenar e recuperar dados musicais. A diretiva DATA em conjunto com rótulos opcionais Symbol foi usada para armazenar valores de bytes sem prefixo e os valores de textos usando o prefixo Word. O comando READ foi usado para recuperar valores armazenados pelas diretivas DATA. Nos exemplos deste capítulo, o argumento Location do comando READ usou sempre a etiqueta opcional Symbol da diretiva DATA para diferenciar os diferentes tipos de dados. Alguns dos rótulos Symbol que foram usados eram notas, durações, pontos e oitavas. Dados musicais podem ser armazenados em formatos que se prestam para a tradução a partir de partituras. Os estilos de dados da partitura podem ser convertidos em frequências usando os comandos LOOKUP e LOOKDOWN. Operações matemáticas também podem ser realizadas sobre os valores de variáveis para alterar a oitava de uma nota dividindo sua frequência a uma potência de dois. Operações matemáticas também são úteis para as durações de notas dando o ritmo ou a duração de uma semibreve. SELECT...CASE foi introduzido como uma forma de avaliar uma variável em uma base caso a caso. SELECT...CASE é particularmente útil para examinar caracteres ou números quando há muitas opções, como o que poderia ser uma variável, e muitos diferentes conjuntos de ações que precisam ser tomadas com base no valor da variável. Um programa que converte sequências de caracteres que descrevem tons musicais para telefones celulares mais antigos (chamados de arquivos RTTTL) foi utilizado para introduzir um programa maior, que faz uso de todas as técnicas de programação apresentadas neste texto. SELECT...CASE desempenhou um papel de destaque neste programa porque ele é usado para examinar os caracteres selecionados em um arquivo RTTTL caso-a-caso. Questões 1. O que causa um tom de som alto e agudo? O que causa um tom de som de baixa frequência? 2. O que FREQOUT 15, 1000, 3000 não faz? Qual o efeito que cada um dos números tem? 3. Como você pode modificar o comando FREQOUT da questão 2, de modo que ele envie duas frequências de uma só vez? 4. Se você encontrar uma chave de piano B6, que frequência ela enviará? 5. Como modificar uma diretiva DATA ou comando READ se desejar armazenar e recuperar valores de texto? 6. Você pode ter mais de uma diretiva DATA? Se sim, como você diria a um comando READ para obter dados a partir de uma ou de outra diretiva DATA? 7. Se souber a frequência de uma nota em uma oitava, o que você tem que fazer para que a frequência a reproduza uma oitava acima? 8. O que SELECT...CASE faz? Exercícios 1. Modifique o tom de Alarme ... de ActionTones.bs2 para que a frequência do tom que desempenha aumente em 500 cada vez que o tom se repetir. Página - 234 2. Explique como modificar MusicWithMoreFeatures.bs2 para que ele exiba uma mensagem de alerta no DEBUG Terminal cada vez que uma nota pontilhada é tocada. Projeto 1. Construa um gerador de tom, controlado por botão. Se um botão for pressionado, o alto-falante deverá fazer um bip de 2 kHz para 0,5 segundo. Se outro botão for pressionado, o alto-falante deverá fazer um sinal sonoro 3 kHz para 1/10 de segundo. Soluções Q1.Nossos ouvidos detectam alterações na pressão do ar como tons. Um tom agudo alto é proveniente de mudanças rápidas na pressão do ar, um tom baixo provém de mudanças mais lentas na pressão do ar. Q2.FREQOUT 15, 1000, 3000 envia um sinal de 3000 Hz a P15 por um segundo (1000 ms). O efeito de cada número: 15 – para o pino de I/O P15, 1000 duração do tom equivalente a 1.000 ms ou um segundo; 3000 - a frequência do tom, em hertz, de modo que este envia um tom de 3000 Hz. Q3.Use o argumento opcional Freq2. Para reproduzir 3000 Hz e dizer 2000 Hz, basta adicionar uma segunda frequência para o comando, depois de uma vírgula: FREQOUT 15, 1000, 3000, 2000 Q4.1975,5 Hz, veja Figura 8-3 na página 207. Q5.Use o modificador opcional Word antes de cada item de dados. Q6.Sim. Cada diretiva DATA pode ter um parâmetro opcional Symbol diferente. Para especificar quais diretivas DATA para obter os dados, inclua o parâmetro Symbol após a palavra-chave READ. Por exemplo: READ Notes, noteLetter. Neste exemplo, o Notes é o parâmetro Symbol. Q7.Para ter uma determinada nota na próxima oitava acima, multiplique a frequência por dois. Q8. SELECT...CASE seleciona uma variável ou expressão, avalia-as caso a caso e executa diferentes blocos de código, dependendo do caso em que o valor da variável se encaixa. E1. Este problema pode ser resolvido aumentando manualmente cada tom por 500, ou através da utilização de um loop FOR ... NEXT, com um valor de 500 STEP. Utilizando o loop FOR...NEXT: Aumente manualmente o tom : Página - 235 DEBUG "Aumentando alarme...", DEBUG "Aumentando CR alarme...",CR PAUSE 100 PAUSE 100 FOR frequency = 1500 TO FREQOUT 9, 500, 3000 STEP 500 PAUSE 500 FREQOUT 9, 500, FREQOUT 9, 500, frequency PAUSE 500 PAUSE 500 FREQOUT 9, 500, NEXT PAUSE 500 FREQOUT 9, 500, PAUSE 500 1500 2000 2500 3000 E2. Modifique as linhas que verificam a nota pontilhada: READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2 Adicione um comando DEBUG ao IF ... THEN. Não se esqueça do ENDIF. READ Dots + index, noteDot IF noteDot = 1 THEN noteDuration = noteDuration * 3 / 2 DEBUG "Dotted Note!", CR ENDIF P1. Use o circuito do piezospeaker da Figura 8-2, na página 201, e circuitos de botão de pressão da Figura 4 -26 na página 108. ' O que é um Microcontrolador ' Ch8Prj01_PushButtonToneGenerator.bs2 ' P4 Pressionado: Bip de 2 kHz por 1/5 de segundo. 2 kHz = 2000 ' Hz. ' 1/5 s = 1000 / 5 ms = 200 ms ' P3 Pressionado: Bip de 3 kHz por 1/10 de segundo. 3 kHz = ' 3000 Hz. ' 1/10 s = 1000 / 10 ms = 100 ms '{$STAMP BS2} '{$PBASIC 2.5} DEBUG "Programa funcionando!" DO IF (IN4 = 1) THEN FREQOUT 9, 200, 2000 ELSEIF (IN3 = 1) THEN FREQOUT 9, 100, 3000 ENDIF LOOP ' 2000 Hz por 200 ms ' 3000 Hz por 100 ms Página - 236 Capítulo 9: Construindo Blocos Eletrônicos ESSES PEQUENOS CHIPS PRETOS Você precisa apenas olhar para o seu BASIC Stamp (veja Figura 9-1) para encontrar exemplos “desses pequenos chips pretos”. Cada um desses chips tem uma função especial. O chip superior direito é o regulador de voltagem. Ele pega a voltagem da bateria e a converte para quase exatamente 5,0 V, que é o que o resto dos componentes do BASIC Stamp precisa para funcionar adequadamente. O chip superior esquerdo é a EEPROM do módulo BASIC Stamp. Programas PBASIC são condensados em números chamados tokens que são baixados para o BASIC Stamp. Esses tokens são armazenados na EEPROM, e você pode vê-los clicando em Executar (Run) e, em seguida, Mapa de Memória (Memory Map) no BASIC Stamp Editor. O chip maior é chamado de Intérprete. É um microcontrolador pré-programado com o PBASIC interpretar que busca os sinais da EEPROM e depois interpreta o comando PBASIC que o token representa. Em seguida, ele executa o comando, busca o próximo token e assim por diante. Este processo é chamado de busca e execução. A EEPROM de 2K armazena o código PBASIC e os dados registrados → Regulador de 5V converte a voltagem de entrada para 5 volt regulados ← Figura 9-1 Circuitos integrados no BASIC Stamp 2 Chip Interpreter PBASIC (um microcontrolador préprogramado) → As pessoas usam o termo "circuito integrado" (CI) para falar sobre esses pequenos chips pretos. O circuito integrado é na verdade um minúsculo chip de silício contido dentro do plástico preto ou da caixa de cerâmica. Dependendo do chip, ele pode ter um lugar entre centenas e milhares de transistores. Um transistor é um bloco básico de construção de circuitos integrados, e você terá a oportunidade de experimentá-los com um transistor neste capítulo. Outros componentes familiares que são projetados em chips de silício incluem diodos, resistores e capacitores. Tire um momento para pensar sobre as atividades que você realizou com este livro até agora. A lista inclui a mudança dos LEDs em on e off, leitura de botões, controle dos servos, leitura dos potenciômetros, medição de luz, displays controlados e reprodução de sons. Mesmo que isso seja apenas o começo, ainda é bastante impressionante, especialmente considerando que você pode combinar essas atividades para fazer Página - 237 aparelhos mais complexos. O coração do sistema que fez todas estas atividades possíveis é constituído apenas pelos três circuitos mostrados na Figura 9-1 e algumas outras peças. Ele apenas mostra quão poderosos os circuitos integrados podem ser, quando projetados para trabalhar em conjunto. EXPANDA SEUS PROJETOS COM CIRCUITOS PERIFÉRICOS INTEGRADOS Existem milhares de circuitos integrados projetados para serem usados com microcontroladores. Ocasionalmente, diferentes fabricantes de circuitos integrados fazem chips que executam a mesma função. Às vezes, as características de cada chip diferem um pouco, e, em outras, os chips são quase idênticos, mas um pode custar um pouco menos do que o outro. Cada um dos milhares de diferentes circuitos integrados pode ser usado como um bloco de construção para uma variedade de modelos. As empresas publicam informações sobre a forma como cada um de seus circuitos integrados age em documentos chamados folha de dados e as disponibiliza em seus sites. Estes fabricantes também publicam notas de aplicação, que mostram como usar o circuito integrado de forma única e útil tornando mais fácil o design dos produtos. Os fabricantes de circuitos integrados dão esta informação na esperança de que os engenheiros usem-nas para construir seus chips na mais recente versão que os brinquedos ou equipamentos devem ter. Se milhares de brinquedos são vendidos, isso significa que a empresa vende milhares de seus circuitos integrados. Neste capítulo, você vai trabalhar com um transistor e um circuito integrado para fins especiais chamado potenciômetro digital. Como mencionado anteriormente, o transistor é um bloco básico para construção de circuitos integrados. É também um bloco básico para construção dos lotes de outros circuitos. O potenciômetro digital também tem uma variedade de utilizações. Tenha em mente que para cada atividade que você fizer, provavelmente existirão centenas de maneiras diferentes que você poderá usar com cada um desses circuitos integrados. ATIVIDADE #1: CONTROLE DO FLUXO ATUAL COM UM TRANSISTOR Nesta atividade, você vai usar um transistor como uma forma de controlar a passagem de corrente através de um LED. Você pode usar o LED para monitorar a corrente, visto que ele brilha mais intensamente quando mais corrente passa através dele e menos intensamente quando menos corrente passa. Apresentando o Transistor A Figura 9-2 mostra o símbolo esquemático e peças do desenho do transistor 2N3904. Existem muitos tipos diferentes de transistores. Este é chamado NPN, que se refere aos tipos de material usado para fabricar o transistor e como esses materiais são mergulhados no silício. A melhor maneira de começar a pensar em um transistor é imaginá-lo como uma válvula que é usada para controlar a corrente. Diferentes transistores controlam a quantidade de corrente que passa através deles por diferentes meios. Este transistor controla a quantidade de corrente que passa em C (coletor) e sai em E (emissor). Ele usa a quantidade de corrente permitida no terminal B (base) para controlar a passagem de corrente através de C a E. Com uma pequena quantidade de Página - 238 corrente permitida em B, a corrente passa 416 vezes mais que o fluxo de corrente do transistor em C e E C C B E Figura 9-2 Transistor 2N3904 B 2N3904 E Ficha Técnica da Peça 2N3904: Como mencionado anteriormente, os fabricantes de semicondutores publicam documentos chamados fichas técnicas para as peças que fazem. Estas fichas contêm informações que os engenheiros usam para projetar uma peça em um produto. Para ver um exemplo de ficha técnica da peça 2N3904: vá para www.fairchildsemi.com. Digite "2N3904" no campo de pesquisa (Search) na página inicial do Fairchild Semiconductor, e clique em Ir (Go). Um dos resultados da pesquisa deverá ser um link para informações sobre o produto 2N3904. Siga-o e procure o link Ficha Técnica. A maioria dos navegadores abre a ficha técnica com o programa Adobe Acrobat Reader. Exemplo de Peças do Transistor (1) Transistor – 2N3904 (2) Resistores – 100 kΩ (marrom-preto-amarelo) (1) LED – qualquer cor (1) Potenciômetro – 10 kΩ (3) Fios Construindo e Testando o Circuito do Transistor A Figura 9-3 mostra um circuito que pode ser usado manualmente para controlar a quantidade de corrente que o transistor permite passar através do LED. Ao torcer o botão do potenciômetro, o circuito transmitirá diferentes quantidades de corrente para a base do transistor. Isto vai causar uma alteração na quantidade de corrente que o transistor permite passar de seu coletor para o seu emissor. O LED lhe dará dar uma indicação clara da mudança, brilhando mais ou menos intensamente. Construa o circuito mostrado na Figura 9-3. o Certifique-se de que o pino de ânodo do LED (o maior) está ligado a VDD. o Verifique o circuito de seu transistor. Note se a face plana do transistor está virada para a direita no diagrama de fiação. Gire o botão do potenciômetro e verifique se o LED muda o brilho, em resposta a uma mudança na posição do wiper terminal do potenciômetro. Página - 239 Vdd Vdd LED 100 kΩ POT 10 kΩ 100 kΩ Vss Vss Figura 9-3 Potenciômetro Manual – Circuito do Transistor Controlado Sua Vez – Mudar o Transistor On/Off Se tudo que você quer fazer é ligar e desligar um transistor, você poderá usar o circuito mostrado na Figura 9-4. Quando o BASIC Stamp enviar um sinal de alta para este circuito, ele fará com que o transistor conduza mais corrente como se você tivesse ajustado o potenciômetro para um brilho máximo. Quando o BASIC Stamp enviar um sinal de baixa para este circuito, ele fará com que o transistor pare de conduzir de corrente, e o LED deverá emitir luz. Qual é a diferença entre conectar este circuito e um circuito de LED para um pino de I/O? Os pinos de I/O do BASIC Stamp têm limitações quanto à quantidade de corrente que podem transmitir. Os transistores têm limitações também, mas são muito mais elevadas. No Sistema de Controle do Guia do Estudante (Process Control Student Guide), um transistor é usado para acionar um pequeno ventilador DC. É também utilizado para fornecer grandes quantidades de corrente a um pequeno resistor que é utilizado como um elemento de aquecimento. Qualquer uma destas duas aplicações atrairia tanta corrente que danificaria, rapidamente, o BASIC Stamp, mas o transistor leva com facilidade. Construa o circuito mostrado na Figura 9- 4. Escreva um programa que envie sinais de alta e baixa para P8 duas vezes por segundo. DICA: LedOnOff.bs2 do Capítulo 2 só precisa ser modificado para enviar sinais de alta/baixa para P8 em vez de P14. Lembre-se de salvá-lo com um novo nome antes de fazer as modificações. Execute o programa e verifique se ele liga/desliga o controle do LED. Página - 240 Vdd Vdd Vin Vss X3 LED P8 100 kΩ 100 kΩ Vss P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Figura 9-4 Circuito que dá ao BASIC Stamp controle de corrente on/off para o LED com um transistor ATIVIDADE #2: INTRODUÇÃO AO POTENCIÔMETRO DIGITAL Nesta atividade, você irá substituir o potenciômetro ajustado manualmente por um potenciômetro de circuito integrado que é ajustado digitalmente. Então, você vai programar o BASIC Stamp para ajustar o potenciômetro digital, que por sua vez irá ajustar o brilho do LED da mesma forma que o potenciômetro manual fez na atividade anterior. Apresentando os Potenciômetros Digitais A Figura 9-5 mostra um mapa do pino do potenciômetro digital que você vai usar nesta atividade. Este chip tem 8 pinos, quatro de cada lado, espaçados para facilitar a ligação na protoboard (1/10 de polegada de distância). O fabricante coloca uma marca de referência na caixa de plástico de modo que você possa diferenciar os pinos 1 e 5. A marca de referência é um semicírculo pequeno no caso do chip. Você pode usar essa marca como uma referência para os números dos pinos no chip, que são contados de baixo para cima, no sentido anti-horário a partir da marca de referência. Substituições de peças: Às vezes é necessário que a Parallax faça substituição de peças. A peça funcionará do mesmo modo, mas o rótulo poderá ser diferente. Se você achar que o potenciômetro digital incluso no kit de peças do seu BASIC Stamp - Kit de Atividades não está etiquetado AD5220, saiba que ele funcionará da mesma maneira e executará corretamente essa atividade. Reference Notch 1 CLK Vdd 8 2 U/D CS 7 3 A1 B1 6 4 GND W1 5 AD5220 Figura 9-5 Mapa do Pino AD5220 Use a marca de referência para se certificar de que você tem o AD5220 do lado direito para cima quando construí-lo em seu circuito no protoboard. Página - 241 Aqui está um resumo de cada um dos pinos AD5220 e suas funções: 1. CLK: Pino que recebe pulsos de relógio (sinais baixo-alto-baixo) para mover o wiper terminal. 2. U/D: Pino que recebe um sinal de alta para fazer o wiper terminal (W1) mudar para A1, e um sinal de baixa para fazê-lo avançar para B1. Este pino só define a direção, o wiper terminal na verdade não se move até que um pulso (sinal baixoalto-baixo) seja enviado para o pino CLK. 3. A1: Terminal A do potenciômetro. 4. GND: Fio terra. O fio terra no Board of Education e no BASIC Stamp HomeWork Board é um terminal Vss. 5. W1: Wiper Terminal do potenciômetro (W). 6. B1: Terminal B do potenciômetro. 7. CS: O chip seleciona um pino. Aplique um sinal de alta para este pino, e o chip ignorará todos os sinais de controle enviados para CLK e U/D. Aplique um sinal de baixa para este pino, que agirá em todos os sinais de controle recebidos. 8. Vdd: Ligue +5 V, que é Vdd no Board of Education e no BASIC Stamp HomeWork Board. Dados Técnicos da Peça AD5220: Para ver os dados técnicos de AD5220: Vá para www.analog.com. Digite "AD5220" no campo de busca na página principal em Dispositivos Analógicos (Analog Devices), e clique no botão Busca (Search). Clique no link Dados Técnicos (Data Sheets). Clique no link que diz "AD5220: Aumento/Diminuição de Dados Técnicos do Potenciômetro Digital (Increment/Decrement Digital Potentiometer Datasheet). Peças do Potenciômetro Digital Controlado pelo Transistor (1) Transistor – 2N3904 (2) Resistor – 100 kΩ (marrom-preto-amarelo) (1) LED – qualquer cor (1) Digital potenciômetro – AD5220 (10) Fios Construindo o Circuito de Potenciômetros Digitais A Figura 9-6 mostra um diagrama esquemático do circuito com o potenciômetro digital utilizado no lugar de um potenciômetro manual, e a Figura 9-7 mostra um diagrama de ligações para o circuito. O BASIC Stamp pode controlar o potenciômetro digital através da emissão de sinais de controle para P5 e P6. Construa o circuito mostrado na Figura 9-6 e na Figura 9-7. Vdd Vdd Vdd AD5220 P6 1 CLK Vdd 8 P5 2 U/D CS 7 B1 6 A1 3 4 GND Figura 9-6 Circuito Esquemático do Potenciômetro Digital Controlado pelo Transistor W1 5 100 kΩ 100 kΩ Vss Vss Página - 242 Vdd Vin Vss X3 Figura 9-7 Diagrama de Fiação para a Figura 9-6 AD5220 P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Controle da Programação de Potenciômetros Digitais Imagine que o botão do potenciômetro manual do exercício anterior tem 128 posições. Imagine também que o potenciômetro está no meio da sua gama de movimentos. Isso significa que você pode girar o botão em uma direção por 63 etapas e em outra por 64. Vamos dizer que você gire o botão do potenciômetro uma vez em sentido horário. O LED vai ficar apenas um pouco mais brilhante. Este seria o mesmo que enviar um sinal de alta ao pino L/D do AD5220 e enviar um pulso (alto-baixo-alto) para o pino CLK. HIGH 5 PULSOUT 6, 1 Imagine agora que você girou o seu potenciômetro manual em 3 etapas no anti-horário. O LED vai ficar um pouco mais escuro. Este seria o mesmo que enviar um sinal de baixa para o pino L/D do AD5220 e enviar três pulsos ao pino CLK. LOW 5 FOR counter = 1 TO 3 PULSOUT 6, 1 PAUSE 1 NEXT Agora imagine que você girou o potenciômetro totalmente no sentido horário. Isso é o mesmo que enviar um sinal de alta para o pino do U/D AD5220 e enviar 65 pulsos ao pino CLK. Agora, o LED deverá estar brilhando. HIGH 5 FOR counter = 1 TO 65 PULSOUT 6, 1 PAUSE 1 NEXT Finalmente, imagine que você girou o seu potenciômetro manual totalmente no sentido anti-horário. O LED não deve emitir luz. Isso é o mesmo que enviar um sinal de baixa para o pino U/D, e aplicar 128 pulsos ao pino CLK. LOW 5 FOR counter = 0 TO 127 Página - 243 PULSOUT 6, 1 PAUSE 1 NEXT Exemplo de Programa: DigitalPotUpDown.bs2 Este programa de exemplo ajusta o potenciômetro para cima e para baixo, a partir de uma extremidade de seu alcance para outra, fazendo com que o LED fique gradualmente mais brilhante e, em seguida, gradualmente, mais opaco. Coloque e execute DigitalPotUpDown.bs2. ' O que é um Microcontrolador - DigitalPotUpDown.bs2 ' Varre o potenciômetro digital através de valores. ' {$STAMP BS2} ' {$PBASIC 2.5} DEBUG "Programa funcionando!" counter DO VAR Byte LOW 5 FOR counter = 0 TO 127 PULSOUT 6, 1 PAUSE 10 NEXT HIGH 5 FOR counter = 0 TO 127 PULSOUT 6, 1 PAUSE 10 NEXT LOOP Sua Vez – Alterando a Taxa e Condensando o Código Você pode aumentar ou diminuir a velocidade para que o LED brilhe e escureça alterando o argumento Duration do comando PAUSE. Modifique e execute novamente o programa usando PAUSE 20 e note a diferença na área em que o LED fica mais brilhante e escuro. Repita o procedimento para PAUSE 5. Você também pode usar um comando chamado TOGGLE para tornar este programa mais simples. O comando TOGGLE alterna o estado de um pino de I/O do BASIC Stamp. Se o pino de I/O estava enviando um sinal alto, o comando TOGGLE faz com que ele envie um sinal baixo. Se o pino de I/O enviou um sinal baixo TOGGLE torna a enviar um sinal alto. Salve DigitalPotUpDown.bs2 como DigitalPotUpDownWithToggle.bs2. Modifique o programa para que ele se pareça com o nome indicado abaixo. Página - 244 Execute o programa e verifique se ele funciona da mesma forma que o DigitalPotUpDown.bs2. Compare o número de linhas de código que ele usou para fazer o mesmo trabalho. A falta de memória do programa é um problema que algumas pessoas encontram quando seus projetos com o BASIC Stamp ficam muito grandes e complicados. Usar o comando TOGGLE em vez de dois loops FOR...NEXT é apenas um exemplo das muitas técnicas que podem ser usadas para fazer o mesmo trabalho com metade do código. ' O que é um Microcontrolador - DigitalPotUpDownWithToggle.bs2 ' Varre o potenciômetro digital através de valores. ' {$STAMP BS2} ' {$PBASIC 2.5} DEBUG "Programa funcionando!" counter LOW 5 VAR Byte DO FOR counter = 0 TO 127 PULSOUT 6,5 PAUSE 10 NEXT TOGGLE 5 LOOP Olhando um Potenciômetro Digital por Dentro A Figura 9-8 mostra um diagrama do potenciômetro dentro do AD5220. O AD5220 tem 128 elementos resistivos, cada um deles é de 78.125 Ω (valor nominal). Todos estes 128 somam 10.000 Ω ou 10 kΩ. 3 A1 78 Ω Ad5220 pos. 127 1 CLK 2 U/D 5 7 CS 78 Ω pos. 126 W1 40 Ω 78 Ω pos. 125 … Figura 9-8 Dentro do AD5220 … 78 Ω pos. 1 78 Ω B1 pos. 0 6 Um valor nominal significa um valor nomeado. Peças como resistores e capacitores normalmente têm um valor nominal e tolerância. Cada um dos elementos resistivos do AD5220 tem um valor nominal de 78.125 Ω, acima ou abaixo do valor nominal com uma tolerância de 30% (23,438Ω), acima ou abaixo do valor nominal. Página - 245 Entre cada um desses elementos resistivos há um interruptor, chamado tomada. Cada interruptor é na verdade um grupo de transistores que são ligados ou desligados para permitir ou não a passagem de corrente. Apenas um destes interruptores pode ser fechado de uma só vez. Se uma das chaves superiores estiver fechada (na pos. 125, 126, ou 127), é como ter o botão do potenciômetro manual girado mais ou todo para o sentido horário. Se pos. 0 ou 1 estiver fechada, é como ter um potenciômetro manual girado todo para o sentido anti-horário. Imagine que pos. 126 está fechada. Se você quiser definir a tomada para 125, (pos. aberta 126 e pos. fechada 125), ajuste U/D baixo, em seguida, aplique um pulso para CLK. Se você quiser definir a tomada para Pos 127, ajuste L/D em alta, e aplique 2 pulsos. Se você quiser trazer a tomada até 1, defina U/D baixo e aplique 126 pulsos. Este próximo programa de exemplo usa o DEBUG Terminal para perguntar que interruptor você deseja. Em seguida, ele decide se define o pino U/D para alto ou baixo, e aplica o número correto de pulsos que deslocará o interruptor de sua configuração antiga para a nova. Com a exceção de EEPROM DATA, o próximo programa de exemplo também tem todas as seções que você normalmente espera encontrar em um programa de aplicação: • • • • • • • • Título - comentários que incluem o nome de um programa, sua descrição e as diretivas Stamp e PBASIC. EEPROM Data - declarações DATA que armazenam listas predefinidas de valores em partes da memória EEPROM que não são necessárias no armazenamento do programa. Definições de I/O - Diretivas PIN que são chamadas de pinos de I/O. Constantes - CON declarações que nomeiam os valores no programa. Variáveis - VAR declarações que atribuem nomes as partes da memória RAM do BASIC Stamp para armazenar valores. Inicialização - uma rotina que faz o programa começar com o pé direito. Neste próximo programa, o interruptor do potenciômetro precisa ser derrubado para baixo de zero. Principal – rotina que manipula as tarefas primárias do programa. Sub-rotinas - segmentos de código que fazem trabalhos específicos, ou para um ou para outro, neste caso, para a rotina principal. Exemplo de Programa: TerminalControlledDigtialPot.bs2 Você pode usar este programa de exemplo e o DEBUG Terminal para definir o interruptor do potenciômetro digital. Ao alterar a configuração do interruptor do potenciômetro digital, você altera o brilho do LED ligado ao transistor que controla o potenciômetro digital. A Figura 9- 9 mostra um exemplo de entrada do valor de 120 na janela de transmissão do DEBUG Terminal enquanto o programa está sendo executado. Uma vez que a configuração antiga do interruptor estava em 65, o LED tornou-se aproximadamente duas vezes mais brilhante do que quando ajustado para 120. Página - 246 Figura 9-9 Enviando mensagens para o BASIC Stamp. Janelas Transmite → Clique na janela de transmissão (superior) e digite os números para nova configuração do interruptor. Recebe → ' ' ' ' Coloque e execute TerminalControlledDigtialPot.bs2. Verifique se a caixa Echo Off não está marcada. Clique na janela de transmissão do DEBUG Terminal para colocar o cursor lá. Digite valores de 0 a 127 para o DEBUG Terminal. Certifique-se de pressionar a tecla Enter depois de digitar os algarismos. -----[ Título ]----------------------------------------------------O que é um Microcontrolador - TerminalControlledDigitalPot.bs2 Atualiza o botão do potenciômetro digital com base na entrada do usuário no Debug Terminal. ' {$STAMP BS2} ' {$PBASIC 2.5} ' -----[ EEPROM Data ]-----------------------------------------------' -----[ Definições de I/O ]-----------------------------------------UdPin ClkPin PIN PIN 5 6 ' Configura valores dos pinos de ' I/O conectados à CLK e U/D ' -----[ Constantes ]------------------------------------------------DelayPulses DelayReader CON CON 10 2000 ' Atrasa para observar o LED ' apagar ' -----[ Variáveis ]-------------------------------------------------counter oldTapSetting newTapSetting VAR VAR VAR Byte Byte Byte ' Contador para FOR...NEXT ' Configuração do botão anterior ' Nova configuração de botão ' -----[ Inicialização ]---------------------------------------------oldTapSetting = 0 newTapSetting = 0 ' Inicializa nova e velha old ' configuração do botão para 0 LOW UdPin FOR counter = 0 TO 127 ' Configura pino U/D para Down ' Configura botão para posição ' mais baixa PULSOUT 6,5 PAUSE 1 NEXT PAUSE 1000 ' Aguarda 1s antes da 1a msg ' -----[ Rotina Principal ]------------------------------------------- Página - 247 DO GOSUB Get_New_Tap_Setting GOSUB Set_Ud_Pin GOSUB Pulse_Clk_pin ' ' ' ' Display do usuário e obtém entrada Configura pino U/D para up/down Entrega pulsos LOOP ' -----[ Sub-rotinas ]-----------------------------------------------Get_New_Tap_Setting: ' Exibe instruções e obtém ' entrada do usuário para nova DEBUG CLS, "Configuração do botão é: ", ' configuração do valor do ' botão DEC newTapSetting, CR, CR DEBUG "Informe novo botão", CR, "setting (0 TO 127): " DEBUGIN DEC newTapSetting RETURN Set_Ud_Pin: ' Examina novo e velho valor ' para decidir valor do pino U/D IF newTapSetting > oldTapSetting THEN ' Notifica usuário se valores HIGH UdPin ' são iguais oldTapSetting = oldTapSetting + 1 ' Incrementa para Pulse_Clk_pin ELSEIF newTapSetting < oldTapSetting THEN LOW UdPin oldTapSetting = oldTapSetting - 1 ' Decrementa para Pulse_Clk_pin ELSE DEBUG CR, "Nova e velha configurações ", CR, "são iguais, tente ", CR, "de novo...", CR PAUSE DelayReader ' Dá tempo para visualizar ENDIF ' mensagem RETURN Pulse_Clk_pin: ' Entrega valores de velhos a novos valores. Lembre-se que ' Set_Ud_Pin ' ajustou o valor de oldTapSetting para newTapSetting por um. ' Isso mantém o loop FOR...NEXT executando de uma a várias vezes. FOR counter = oldTapSetting TO newTapSetting PULSOUT ClkPin, 1 PAUSE DelayPulses NEXT oldTapSetting = newTapSetting RETURN ' Acompanha novos e velhos ' valores de tapSetting SUMÁRIO Este capítulo introduziu circuitos integrados e como eles podem ser usados com o BASIC STAMP. Um transistor foi utilizado como uma válvula de corrente e um potenciômetro digital foi usado para controlar a quantidade de corrente que passa Página - 248 através do transistor. Ao examinar o potenciômetro digital foram introduzidos marca de referência e mapa do pino como elementos importantes dos chips eletrônicos. Foi discutida a função de cada um dos pinos do potenciômetro digital, assim como a estrutura interna do dispositivo. O comando PBASIC TOGGLE foi introduzido como um meio para salvar a memória do programa. Questões 1. Quais são os nomes dos terminais do transistor que você usou neste capítulo? 2. Que terminal controla a corrente que passa através do transistor? 3. O que você pode fazer para aumentar ou diminuir a passagem de corrente através do transistor? Exercício 1. Escreva um programa que ajusta o interruptor no potenciômetro digital para a posição 0, independente de sua configuração atual. Projeto - Desafio Avançado 1. Adicionar um fototransistor ao seu projeto e fazer com que o brilho do LED seja ajustado com o brilho visto pelo fototransistor. Nota: vale a pena ler a solução dada, pois demonstra uma abordagem útil para o dimensionamento de uma entrada para uma saída. Soluções Q1.Emissor, base e coletor. Q2.A base controla a corrente que passa através do transistor. Q3.Aumentar ou diminuir a corrente permitida na base do transistor. E1. Para resolver este exercício, olhe para TerminalControlledDigitalPot.bs2. A primeira coisa que ele faz, na seção de inicialização, é definir o botão para a posição mais baixa. O código exato está na solução abaixo. ' O que é um Microcontrolador - Ch9Ex01_SetTapToZero.bs2 ' Vire o botão no potenciômetro digital até o fim, zero. ' {$STAMP BS2} ' {$PBASIC 2.5} DEBUG "Programa funcionando!" UdPin ClkPin counter PIN PIN VAR LOW UdPin FOR counter = 0 TO 128 PULSOUT ClkPin,5 PAUSE 1 NEXT 5 6 Byte ' Configura valores dos pinos ' I/O conectados à CLK e U/D ' Contador de FOR...NEXT ' Configura pino U/D p/ Down ' Configura botão para ' posição mais baixa Página - 249 P1. Usar o circuito do potenciômetro digital a partir da Figura 9-6 na página 238 e o circuito do fototransistor da Figura 7-4 na página 171. Esta solução se baseia no TerminalControlledDigitalPot.bs2, e incorpora elementos do PhototransistorAnalogToBinary.bs2 do Capítulo 7, Atividade #5. Aplica-se também alguma álgebra para resolver um problema de escala que faz com que o intervalo de valores que você poderia conseguir a partir da medida que o fototransistor RCTIME se encaixe em um intervalo de 0 a 128 para o potenciômetro digital. Tenha em mente que este é exemplo de solução, e, de modo algum, a única solução ou abordagem. O sub-rotina GOSUB Get_New_Tap_Setting chamada do programa TerminalControlledDigitalPot.bs2 é substituída por duas outras chamadas de GOSUB Read_Phototransistor e GOSUB sub-rotinas: Scale_Phototransistor. Da mesma forma, a sub-rotina Get_New_Tap_Setting é substituída pelas sub-rotinas Read_Phototransistor e Scale_Phototransistor. Read_Phototransistor é uma versão da sub-rotina dos comandos que levam a medição RCTIME do fototransistor e limitam a sua gama de entrada em PhototransistorAnalogToBinary.bs2. Os nomes do pino, das constantes e das variáveis foram ajustados, e o PAUSE 100 para uma exibição de 10 vezes por segundo foi alterado para PAUSE 1, que é tudo que é necessário para carregar o capacitor antes de tomar a medida RCTIME. Depois que esta sub-rotina armazenar um valor na variável lightReading, ele será algo entre ValMin (100) e ValMax (4000). Certifique-se de testar e ajustar esses valores para suas próprias condições de iluminação. O problema que temos agora é que existem apenas 128 interruptores configurados e 3.900 possíveis medidas RCTIME para o fototransistor. Para corrigir isso, precisamos dividir a medição RCTIME do fototransistor por algum valor para torná-lo apto para a faixa de 0 a 127. Então, nós sabemos que precisamos dividir a gama de valores de entrada por algum valor para fazê-lo caber em 128 valores. Isto é parecido com uma equação: Range of Possible Phototransistor Measurements = 128 Possible Tap Settings Scale Divisor Para resolver isso, multiplique ambos os lados da equação pelo Scale Divisor, em seguida, divida ambos os lados por 128 possíveis configurações do interruptor. Scale Divisor = Range of Possible Phototransistor Measurements 128 Possible Tap Settings No código, o leque de possíveis medidas do fototransistor é ValMax ValMin, scaleDivisor é uma variável, e 128 é uma constante. Assim, este código a partir seção Declarações e Inicialização (Declarations and Initialization) estabelece o valor de scaleDivisor assim: scaleDivisor = (valMax – valMin) / 128 Página - 250 medição RCTIME do fototransistor, a sub-rotina Scale_Phototransistor subtrai valMin de lightReading e depois divide a medição por scaleDivisor. O resultado mapeia a faixa de medição 100 a 4000 entradas para 0 a 127 saídas da faixa de ajuste do interruptor. Depois de cada Scale_Phototransistor: lightReading = (lightReading – valMin) / scaleDivisor RETURN Assumindo que ValMin é 100 e ValMax é 4000, a variável lightReading poderia armazenar 3.900 valores possíveis. E se a faixa de entrada foi ValMin = 10.000 para ValMax = 13900? Ao subtrair ValMin = 10.000, ainda existem 3900 valores possíveis, e dividir scaleDivisor corretamente é que vai mapear a medida para o ajuste do interruptor do potenciômetro digital correspondente. Se o seu código não subtrair primeiro ValMin, o valor resultante em escala seria completamente fora do intervalo de 0 a 128 para o potenciômetro digital ' O que é um Microcontrolador Ch9Prj01_PhotoControlledDigitalPot.bs2 ' Atualiza botão do potenciômetro digital baseado na leitura do ' Fototransistor ' {$STAMP BS2} ' {$PBASIC 2.5} ' -----[ Declarações e Inicialização ]---------------------------UdPin ClkPin PhotoPin DelayPulses DelayReader valMax valMin PIN PIN PIN CON CON CON CON 5 6 2 10 2000 4000 100 ' ' ' ' counter oldTapSetting newTapSetting lightReading scaleDivisor VAR VAR VAR VAR VAR Byte Byte Byte Word Word ' ' ' ' ' Config. valores dos pinos I/O conectados à CLK e U/D. Fototransistor no pino P2 Atraso p/ observar LED apagar ' Valor máx. fototransistor ' Valor min. fototransistor Contador para FOR...NEXT Configuração anterior do botão Nova configuração do botão lida pelo fototransistor Para valores de escala ' Estabelece um valor que pode ser dividido em uma medida do ' RCTIME do fototransistor para dimensionar sua escala em um ' intervalo de 0 à 128 scaleDivisor = (valMax - valMin) / 128 oldTapSetting = 0 newTapSetting = 0 ' Inicializa nova e velha ' configuração do botão em zero LOW UdPin FOR counter = 0 TO 127 ' Configura pino U/D para Down ' Configura botão para posição ' mais baixa PULSOUT ClkPin,5 PAUSE 1 ' Página - 251 NEXT PAUSE 1000 ' 1 s antes da primeira mensagem ' -----[ Rotina principal ]--------------------------------------DO GOSUB Read_Phototransistor GOSUB Scale_Phototransistor newTapSetting = lightReading MIN 1 MAX 127 DEBUG HOME, DEC5 lightReading GOSUB Set_Ud_Pin ' Configura pino U/D p/ up/down GOSUB Pulse_Clk_pin ' Entrega pulsos LOOP ' -----[ Sub-rotinas ]-------------------------------------------Set_Ud_Pin: ' Examina velho e novo IF newTapSetting > oldTapSetting THEN 'valor do botão p/ decidir HIGH UdPin ELSEIF newTapSetting < oldTapSetting THEN 'valor de UdPin. Avisa LOW UdPin ' usuário se os valores ENDIF ' forem iguais RETURN Pulse_Clk_pin: ' Entrega pulsos FOR counter = oldTapSetting TO newTapSetting ' do velho a novo PULSOUT ClkPin, 1 ' valor PAUSE DelayPulses NEXT oldTapSetting = newTapSetting ' Controla novo e velho valor RETURN ' de tapSetting Read_Phototransistor: HIGH PhotoPin PAUSE 1 RCTIME PhotoPin, 1, lightReading lightReading = lightReading MAX valMax MIN valMin RETURN Scale_Phototransistor: lightReading = (lightReading - valMin) / scaleDivisor RETURN Página - 252 Capítulo 10: Protótipos De Suas Próprias Invenções Este texto introduziu conceitos básicos de um computador de bordo em projetos e invenções. Você agora já tem alguma experiência com os componentes de um circuito comum em produtos de uso diário que incluem: luzes indicadoras, botões, servos, mostradores, displays digitais, sensores de luz, alto-falantes, transistores, e outros circuitos integrados. Você agora também já sabe conectar esses circuitos para o microcontrolador BASIC Stamp e escrever códigos para testar cada um deles, bem como integrá-los em pequenas aplicações. A esta altura, você pode estar interessado em usar suas novas habilidades para inventar alguma coisa, ou para saber mais, ou talvez ambos. O que você aprendeu neste livro pode introduzi-lo no caminho para fazer protótipos para uma ampla variedade de invenções. Neste capítulo, vamos usar um sistema de micro alarme, por exemplo, um protótipo de um dispositivo familiar. Ao longo do caminho, nós vamos cobrir algumas técnicas e práticas importantes de prototipagem, incluindo: • • • • • • • Sugestões para iniciar o desenvolvimento de suas ideias de design e invenções; Um exemplo de como construir e testar cada subsistema no protótipo; Exemplos de como incorporar o código de teste para o código do projeto; Boas práticas de comentários de código e versões de arquivos; Exemplos de como usar peças conhecidas como dispositivos substitutos com interfaces semelhantes; Dicas e truques para superar os obstáculos dos últimos projetos; Qual o próximo passo para encontrar mais projetos Stamps in Class e dispositivos interessantes; APLICANDO O QUE VOCÊ SABE COM OUTRAS PEÇAS E COMPONENTES O circuito do botão de pressão que vimos no Capítulo 3 é um exemplo de um dispositivo de entrada muito simples, que converte uma condição física (mesmo que alguém tenha ou não pressionado um botão), para um sinal de alta ou baixa, que o Basic Stamp pode detectar e processar. Você também usou botões em aplicações para controlar luzes piscando, posições do servo e tons do alto-falante. Existem muitos sensores que detectam uma condição física diferente de "contato" que também enviam sinais de alta ou baixa a um pino de I/O que o BASIC Stamp pode monitorar. Alguns exemplos incluem gás, movimento e sensores de som e muitos outros mais. Agora que você já tem experiência em fazer o BASIC Stamp monitorar um circuito de botão, o monitoramento de um som ou sensor de movimento é muito semelhante, e, certamente, um próximo passo razoável. Outra técnica deste livro é a medição da queda de RC com o comando RCTIME para sentir a posição do botão do potenciômetro e os níveis de luz, tanto com um fototransistor ou com um LED. Estes exemplos são apenas a ponta do iceberg em termos de sensores, que podem ser usados com um circuito de decaimento RC. Outros exemplos incluem umidade, temperatura e pressão e, ainda, é só o começo. A luz indicadora de LED proporciona ainda outro exemplo de circuito que representa uma variedade de circuitos, com diferentes funções. O circuito de LED é controlado pela saída do pino de I/O de alta/baixa do BASIC Stamp. Com circuitos de suporte Página - 253 adicionais, você pode usar os sinais de alta/baixa para fazer motores elétricos irem para frente e para trás, ligar/desligar as luzes, dispositivos de aquecimento e muito mais. Agora, pense em todos os outros dispositivos que você experimentou neste livro. Cada um deles é apenas um exemplo de uma lista de dispositivos com interfaces semelhantes que você pode usar para criar protótipos para todo tipo de invenções. PROTÓTIPO DE UM MICRO SISTEMA DE SEGURANÇA Neste capítulo, vamos usar peças do BASIC Stamp - Kit de Atividades para fazer um pequeno protótipo de sistema de segurança que você poderá usar em uma mesa, aparador, caixa de ferramentas, ou armário. Pode servir para aqueles irmãos ou colegas de trabalho que você suspeita que pegam suas coisas sem pedir. Com este protótipo, nós também vamos investigar outras peças e componentes que você pode substituir em seu sistema de segurança que operam sobre os mesmos princípios que as peças dos kits familiares, mas poderia dar ao seu sistema uma funcionalidade muito maior. A partir daí, veremos como encontrar, entender, testar e incorporar outras peças que você pode nunca ter trabalhado antes. Página - 254 ATIVIDADE #1: DA IDEIA A PROVA DE CONCEITO Muitos produtos começam como uma ideia, em alguns casos, uma invenção que poderia ser "muito legal", e em outros é algo que resolve um problema. Esta ideia pode ser desenvolvida em um conceito com desenhos e especificações e em algum projeto inicial de trabalho. O próximo passo é, tipicamente, desenvolver um protótipo de trabalho. Pode não ser bonito, mas deve demonstrar de forma confiável que um dispositivo pode ser feito para funcionar de acordo com o conceito e especificação. Em empresas que desenvolvem produtos, esta prova de conceito é, normalmente, necessária para obter a aprovação, gestão e financiamento para continuar o desenvolvimento do produto. Ideia, Conceito e Descrição das Funções Digamos que você tenha um armário com uma porta em uma dobradiça e uma gaveta, e ele precisa de um sistema de alarme muito pequeno. Ou talvez você deseja criar um gabinete especial embutido com segurança. A Figura 10-1 mostra um esboço da forma como um potenciômetro e contato elétrico semelhante a um botão de pressão pode ser utilizado para detectar quando uma porta ou gaveta estiver aberta. Este esboço é semelhante a um diagrama de conceito, que se concentra apenas em transmitir o que o produto ou a invenção faz. Figura 10-1 Esboço da modelo de um micro Sistema de Segurança de um Gabinete A descrição funcional é importante. Quando você tem uma ideia melhor do que o seu dispositivo está, a princípio, para fazer, evita problemas que poderão acontecer se você tiver que redesenhar o dispositivo para acomodar algo que você não pensava. Designers e empresas que criam dispositivos personalizados para os clientes têm que ter muito cuidado ao interrogar os seus clientes para entender o que eles desejam. Especialmente, para os dispositivos feitos sob medida, redesenhar pode ser extremamente caro e demorado. Aqui está um exemplo de uma breve descrição funcional que podemos usar para o nosso sistema simples: Desenvolver um protótipo de circuito e programa para um micro sistema de alarme que pode monitorar uma pequena porta que tem uma dobradiça e uma gaveta. Se armado, o alarme deve soar se a porta ou gaveta estiver aberta. Um LED de Página - 255 status deverá brilhar verde quando o alarme não estiver armado, e vermelho quando estiver. Um protótipo pode ser armado e desarmado pelo controle do computador. Um tempo de atraso deve ser incorporado depois que o dispositivo foi armado para permitir que o usuário feche o gabinete. Especificação Além da descrição funcional, se possível, uma especificação normalmente é responsável pelos muitos aspectos do dispositivo proposto, incluindo: custo, consumo de energia, tensão, dimensões, peso, volume do alto-falante, entre outros detalhes. Design Inicial Muitas vezes, o projeto inicial envolve um brainstorming de abordagens que "pode" resolver o problema de design, e muitas dessas ideias têm de ser testadas para saber se elas realmente são viáveis. Outras partes do projeto podem envolver peças bastante normais ou comuns e práticas de design. Nosso micro alarme se encaixa nesta categoria, pelo menos, para o protótipo. Um botão de pressão pode ser montado no armário de modo que quando a gaveta for fechada, ela pressionará o botão de pressão. Para a dobradiça de uma porta, um potenciômetro poderá ser ligado de modo que torça com a porta e possa detectar a posição da mesma. O LED bicolor é um indicador familiar, e o piezospeaker é, certamente, um gerador de ruído já bem familiar. Então, agora já conhecemos os circuitos necessários para o nosso micro protótipo de segurança do gabinete: LED bicolor, botão, potenciômetro e piezospeaker. Aqui está uma lista de capítulos e atividades, onde cada um desses circuitos foi introduzido: • • • • LED Bicolor: Capítulo 2, Atividade #5 Botão: Capítulo 3, Atividade #2 Potenciômetro: Capítulo 5, Atividade #3 Piezospeaker: Capítulo 8, Atividade #1 Lista de Peças do Alarme do Gabinete Retornando a todos os capítulos e colocando todas as peças juntas, você obterá essa lista de peças: (3) Resistores – 220 Ω (vermelho-vermelho-marrom) (1) Resistores – 10 kΩ (marrom-preto-laranja) (1) LED – bicolor (1) Botão – normalmente aberto (1) Piezospeaker (1) Capacitor – 0.01 µF (1) Potenciômetro – 10 kΩ (4) Fios Esquema do Alarme do Gabinete O esquema na Figura 10-2 é organizado para dar a todos os componentes muito espaço para a protoboard, por isso nem todas as conexões dos pinos de I/O são as mesmas dos capítulos anteriores. Você terá que ter isso em mente quando colher exemplos de código a partir dos capítulos anteriores para testar cada um dos circuitos. Página - 256 Figura 10-2: Esquema do Protótipo do Sistema de Alarme ATIVIDADE #2: CONSTRUIR E TESTAR CADA CIRCUITO INDIVIDUALMENTE Sempre que possível, teste cada subsistema individualmente antes de tentar fazê-los trabalhar juntos. Se você seguir esta regra, seus projetos serão mais tranquilos, e isto economizará tempo para resolução dos problemas. Por exemplo, se todos os circuitos são construídos, mas não testados, as pessoas têm uma tendência natural de gastar muito tempo examinando o código e esquecer de verificar cada circuito. Assim, a economia de tempo, mais importante, neste processo é garantir que não há erros de circuito do que você tentar se enganar pensando que eles são erros de codificação. Construindo e Testando Cada Circuito Esta atividade se concentra nos subsistemas individuais, construção e teste de cada circuito. Uma vez que o circuito de botão for construído e testado, vamos construir e testar o circuito de alto-falante. Depois de repetir esse processo com o potenciômetro e com o LED bicolor. Assim, os circuitos já serão todos "bem conhecidos" e estarão prontos para aplicação de alguns códigos. Encontre o código de teste no Capítulo 3, Atividade #2 para que você possa adaptar e testar o circuito de botão da Figura 10-2. Altere as referências dos pinos de I/O para que ele funcione com o circuito na Figura 10-2. Página - 257 Teste o código e corrija eventuais defeitos (bugs) ou erros de fiação antes de continuar. Repita este mesmo processo para: o Circuito do Piezospeaker: Capítulo 8, Atividade #1 o Circuito do Potenciômetro: Capítulo 5, Atividade #3 o Circuito do LED bicolor: Capítulo 2, Atividade #5 Certifique-se de salvar cada programa modificado sob um novo nome, de preferência em uma pasta separada, talvez chamada "WAM Capítulo 10". Sua Vez – Sistema de Teste Agora que todos os circuitos estão testados, e todos os programas de teste salvos no seu PC, é hora de construir um teste do sistema que exibe mensagens de debug, indicando que o circuito está sendo testado e como ele executa o código de teste. Este é um exercício útil, pois os sistemas de alarme têm auto teste e formas de diagnóstico que utilizam todos os recursos em uma rotina. Combine os elementos em seus programas de teste em um único programa que: o Comece por exibir a cor do LED bicolor no DEBUG Terminal conforme ele atualiza a cor.... o Em seguida, exibe uma mensagem dizendo que o piezospeaker está emitindo um som enquanto ele apita... o Finalmente entre em um loop que relata repetidamente o sensor do botão da gaveta e o status do sensor do potenciômetro na dobradiça da porta no DEBUG Terminal. Teste e corrija todos os erros antes de continuar. ATIVIDADE #3: ORGANIZAR A CODIFICAÇÃO DE TAREFAS EM PEQUENOS PEDAÇOS Assim como cada circuito deve ser construído e testado antes de fazê-los trabalhar juntos, cada característica do código também deve ser desenvolvida e testada, individualmente, antes de incorporá-la a uma aplicação maior. MicroAlarmProto(Dev009).bs2 é o exemplo de um programa que está em seu caminho para uma prova de conceito. Sua interface do DEBUG Terminal está no lugar, e o sistema de alarme circula corretamente através de suas várias formas ou estados, incluindo não armado, armando, armado e disparado. Neste ponto, a sub-rotina Alarm_Arming no final do programa ainda está em construção. Ela tem um código no lugar que dispara o alarme se o botão de pressão for liberado, o que indica que a gaveta foi aberta, mas que ainda não monitora a dobradiça da porta. O código do potenciômetro tem de ser adicionado à sub-rotina Check_Sensors que mede a sua posição. Se a sua posição estiver além de um certo limite, 15, por exemplo, a variável state, deve ser alterada para triggered. Duas tarefas adicionais, que permanecem, são ligar o LED bicolor verde quando o alarme não estiver armado, e vermelho, quando ele estiver. Estas tarefas restantes são indicadas pelos comentários no código que se parecem com estes: ' A Fazer: LED bicolor verde ... Página - 258 ' A Fazer: LED bicolor vermelho ... ' A Fazer: Verificar se o potenciômetro está acima do limite de valor. Se sim, então, engatilhe o alarme. Coloque manualmente o Hand-enter MicroAlarmProto(Dev-009).bs2 no BASIC Stamp Editor (recomendado), ou baixe-o a partir de www.parallax.com/go/WAM e abra-o com o BASIC Stamp Editor. Analise o programa e observe como cada sub-rotina é modular e faz um trabalho específico. Isso faz parte da organização de tarefas de codificação em pequenos pedaços. Se você não se lembra de como usar a janela de Transmissão e Recebimento no DEBUG Terminal (Debug Terminal’s Transmit and Receive), reveja a Figura 99 na página 246. Carregue o MicroAlarmProto(Dev-009).bs2 para o BASIC Stamp e use a janela de transmissão do DEBUG Terminal para digitar o caractere A para armar o alarme, e D para desarmar o alarme. O sistema faz uma breve contagem regressiva antes de armar o alarme. Certifique-se de pressionar e segurar o botão antes de armar o alarme. Enquanto o alarme está armado, solte o botão. Você terá a chance de desarmar o alarme após alguns segundos do alarme soar. Arme o alarme novamente. Desta vez, digite "D" para desarmar o alarme antes de soltar o botão. ' -----[ Título ]----------------------------------------------------' O que é um Microcontrolador - MicroAlarmProto(Dev-009).bs2 ' Teste do sistema de alarme de armário. ' {$STAMP BS2} ' {$PBASIC 2.5} ' Target = BASIC Stamp 2 ' Linguagem = PBASIC 2.5 ' -----[ Constants ]-------------------------------------------------NotArmed Arming Armed Triggered CON CON CON CON 0 1 3 4 ' Estados do sistema de alarme ' -----[ Variables ]-------------------------------------------------seconds counter char state VAR VAR VAR VAR Word Byte Byte Nib ' Armazena contagem de segundos ' Para contagem ' Armazena caracteres ' Armazena estado do sistema de alarme ' -----[ Inicialização ]---------------------------------------------PAUSE 1000 DEBUG "Programa funcionando..." state = NotArmed ' Aguarda 1 segundo ' Exibe mensagem de funcionamento ' Inicializa estado do alarme ' -----[ Rotina principal ]------------------------------------------DO SELECT state CASE NotArmed ' Loop principal ' Avalia estado caso a caso ' Se estado = não armado Página - 259 GOSUB Prompt_to_Arm CASE Arming GOSUB Alarm_Arming CASE Armed LOOP GOSUB Check_Sensors GOSUB Prompt_to_Disarm CASE Triggered GOSUB Alarm_Triggered ENDSELECT ' ' ' ' ' ' ' ' ' ' ' ' Faz: LED bicolor verde Chama Prompt_to_Arm Se estado = Armando Chama Alarm_Arming Se estado = Armado Faz: LED bicolor vermelho Chama Check_Sensors Chama Prompt_to_Disarm Se estado = Acionado Chama Alarm_Triggered Termina de avaliar caractere Repete loop principal ' =====[ Sub-rotinas ]================================================ ' -----[ Sub-rotina - Prompt_To_Arm ]--------------------------------Prompt_to_Arm: DEBUG CLS, "Pressione A para armar", CR, ">" ' Exibe mensagem GOSUB Get_User_Input ' Chama Get_User_Input RETURN ' Retorna de Prompt_to_Arm ' -----[ Sub-rotina - Prompt_to_Disarm ]-----------------------------Prompt_to_Disarm: DEBUG CLS, "Pressione D para desarmar", CR, ">" ' Exibe mensagem GOSUB Get_User_Input ' Chama Get_User_Input RETURN ' Retorna de Prompt_to_Disarm ' -----[ Sub-rotina - Alarm_Arming ]---------------------------------Alarm_Arming: DEBUG CLS, "Feche a porta.", ' Avisa usuário para fechar a porta CR, "Você tem" FOR seconds = 8 TO 0 ' Contagem regressiva DEBUG CRSRX, 9, DEC seconds, CLREOL, ' Exibe tempo restante " segundos..." PAUSE 1000 ' Aguarda 1 segundo NEXT ' Repete contagem regressiva state = Armed ' Configura estado da variável para Armado RETURN ' Retorna de Alarm_Arming ' -----[ Sub-rotina - Alarm_Armed ]----------------------------------Alarm_Armed: DO GOSUB Prompt_To_disarm GOSUB Check_Sensors LOOP UNTIL state <> Armed RETURN ' ' ' ' ' Loop Armado Busca por entrada do usuário Checa sensores Repete até estado não armado Retorna de Alarm_Armed ' -----[ Sub-rotina - Alarm_Triggered ]------------------------------Alarm_Triggered: DO DEBUG CLS, "Alarme acionado!!!" FOR counter = 1 TO 15 FREQOUT 6, 100, 4500 PAUSE 100 NEXT FOR seconds = 1 TO 6 ' Loop do Alarme Acionado ' Exibe aviso ' Toca 15 tons de alarme ' 3 s para usuário desarmar Página - 260 IF state <> triggered THEN EXIT GOSUB Prompt_to_Disarm NEXT LOOP UNTIL state <> triggered ' Repete até desarme ' -----[ Sub-rotina - Get_User_Input ]-------------------------------Get_User_Input: char = 0 ' Limpa variável de caractere SERIN 16, 84, 500, Timeout_Label, [char] ' Aguarda 0,5 s para ' pressionarem tecla GOSUB Process_Char ' Com tecla, chama Process_Char Timeout_Label: ' Sem tecla, pula chamada RETURN ' Retorna de Get_User_Input ' -----[ Sub-rotina - Process_Char ]---------------------------------Process_Char: SELECT char ' Avalia caractere caso a caso CASE "A", "a" ' Se "A" ou "a" state = Arming ' Muda estado da variável para Armando CASE "D", "d" ' Se "D" ou "d" state = NotArmed ' Muda estado da variável para Não Armado CASE ELSE ' Se não for "A", "a", "D", "d" DEBUG "Wrong character, try again" ' Exibe mensagem de erro PAUSE 2000 ' Dá 2 s para usuário ler ENDSELECT ' Termina de avaliar caractere RETURN ' Retorna de Process_Char ' -----[ Sub-rotina - Check_Sensors ]--------------------------------Check_Sensors: ' Faz: Verifica se o potenciômetro está no valor limite. ' Se sim, então, aciona o alarme IF IN0 = 0 THEN state = Triggered ' Botão liberado? Dispara alarme. RETURN ' Retorna de Check_Sensors Novas Técnicas de Codificação no Código de Exemplo Dê uma olhada no segundo loop FOR...NEXT na subrotina Alarm_Triggered: FOR seconds = 1 TO 6 IF state <> triggered THEN EXIT GOSUB Prompt_to_Disarm NEXT Se uma chamada para a sub-rotina Prompt_to_Disarm resultar em uma mudança na variável de estado, a instrução IF...THEN usa EXIT para sair do loop FOR...NEXT antes que sejam feitas as 6 repetições. Outro novo comando chamado SERIN aparece na sub-rotina Get_User_Input. DEBUG e DEBUGIN são versões especiais dos comandos SEROUT e SERIN. Para ver como isso funciona, tente substituir o comando DEBUG do “Programa funcionando...” por SEROUT 16, 84, ["Programa funcionando..."]. Ao contrário dos comandos DEBUG e DEBUGIN, os comandos SEROUT e SERIN podem se comunicar com qualquer pino de I/O, ou pino 16 para comunicação com o DEBUG Terminal. Eles também têm códigos especiais que Página - 261 você pode usar para selecionar a taxa de transmissão descrita nos comandos SERIN e SEROUT tabelas de taxa de transmissão no manual do BASIC Stamp. Get_User_Input: char = 0 SERIN 16, 84, 500, Timeout_Label, [char] GOSUB Process_Char Timeout_Label: RETURN A sub-rotina Get_User_Input começa definindo a variável de char para 0 para limpar os antigos valores que char pode estar armazenando. Em seguida, ela executa o comando SERIN, com o seu valor opcional Timeout ajustado para 500 ms (metade de um segundo), com a etiqueta de tempo limite opcional definida para Timeout_Label, que está duas linhas abaixo. Se o comando SERIN receber um caractere dentro em 500 ms, ele armazenará o resultado na variável char e passará para a próxima linha, que chamará a sub-rotina Process_Char. Se ele não conseguir um caractere em 500 ms, ele saltará para Timeout_Label, o que faz com que ele pule sobre a sub-rotina chamada. Sua Vez – Próximos Passos para a Prova de Conceito É hora de fazer este programa funcionar, como uma prova de conceito. Salve uma cópia do MicroAlarmProto(Dev-009).bs2 como MicroAlarmProto(Dev-010).bs2. Use segmentos do seu código testado na Atividade #2 para completar os três itens “Faz”. Teste seu código modificado, e quando ele estiver funcionando bem, salve uma cópia do código como MicroAlarmProto(Dev-011).bs2. ATIVIDADE #4: DOCUMENTAR O SEU CÓDIGO! MicroAlarmProto (Dev-011).bs2 não está completamente terminado, porque ele ainda precisa de alguma documentação e outras mudanças que tornam o programa mais fácil de modificar e manter. Por exemplo, na sub-rotina Alarm_Triggered, o comando FREQOUT 6, 100, 4500 tem o que alguns programadores chamam de "números misteriosos”. Números misteriosos são valores que são usados de uma forma que o observador casual possa não ser capaz de discernir com facilidade. Você poderia reescrever este comando como FREQOUT SpeakerPin, BeepTime, AlarmTone. Depois, você pode adicionar uma seção de diretivas Pin acima da seção Constants, e declarar SpeakerPin PIN 6. Além disso, na seção Constants, declarar BeepTime CON 100, e AlarmTone CON 4500. Nem toda constante em um determinado programa tem que ser nomeada. Tenha em mente que os números misteriosos são valores que são usados de uma forma que o observador casual possa não ser capaz de discernir com facilidade. Outro exemplo a partir da sub-rotina Alarm_Triggered é: FOR seconds = 1 TO 6 ' 3 s para usuário desarmar Página - 262 Os números 1 e 6 não são números misteriosos, porque é claro que eles fazem o loop FOR...NEXT repetir seis vezes, e o comentário à sua direita indica que seis repetições têm a duração de três segundos. Nem todos os supervisores podem concordar com essa interpretação, e alguns podem enfaticamente proclamar que o 1 e o 6 são realmente números misteriosos. Se você acabar de codificar o seu trabalho e seu chefe for um defensor da nomeação de constantes, é uma boa ideia apenas aderir a qualquer estilo de codificação. Vá para MicroAlarmProto(Dev-011).bs2 e documente os números misteriosos, declarando as diretivas dos pinos e as constantes, e substituindo seus nomes por números no programa. Uma exceção às diretivas PIN é o argumento Pin do comando SERIN, que deve ser declarado como uma constante e não como um pino. Argumentos pinos são para pinos de I/O e variam de P0 a P15. O argumento Pin 16 faz com que o comando SERIN ouça o pino SIN do módulo BASIC Stamp, que está conectado à porta de programação da sua placa. Outra área onde a documentação MicroAlarmProto(Dev-011).bs2 ainda é fraca é nos comentários que explicam cada rotina e sub-rotina. Cada sub-rotina deve ter comentários que explicam o que ela faz, e qualquer variável depende dela para fazer seu trabalho, e de todas as variáveis que a sub-rotina usa para armazenar os resultados antes de seu RETORNO. Aqui está um exemplo de boa documentação adicionada ao início da sub-rotina Process_Char. ' -----[ Sub-rotina - Process_Char ]--------------------------'Atualize a variável de estado com base no conteúdo da 'variável do tipo char. Se char contém "A" ou "a", a constante 'Armed fica armazenada no lugar. Se char contém "D" ou "d", 'a constante Not-Armed fica armazenada no lugar. ' Process_Char: '... code omitted here RETURN ' Return from... Atualize as descrições entre os títulos das sub-rotinas e seus rótulos, e repita a rotina principal também. Quando você terminar, salve uma cópia do seu código com o nome MicroAlarmProofOfConcept(v1.0).bs2 Guardar Cópias e Números de Versão de Incremento Após Cada Pequena Mudança Não se esqueça de continuar salvando as cópias de seu código com os pequenos ajustes. Isto facilita retroceder pequenos passos, para o código correto, se sua(s) mudança(s) causar(em) erro(s). Por exemplo, antes de sua próxima modificação, salve o arquivo como MicroAlarmProofOfConcept(v1.01).bs2, ou talvez mesmo v1.01a. Quando a sua próximo função estiver totalmente implementada, escolha um passo de revisão razoável. Se for uma revisão menor, tente v1.1, se grande, vá até a v2.0. Página - 263 ATIVIDADE #5: DÊ AO SEU APP UMA SURPREENDENTE NOVA FUNCIONALIDADE Como mencionado anteriormente, cada circuito que você trabalhou neste texto é realmente um exemplo de um grupo de componentes e módulos que interagem da mesma maneira com o BASIC Stamp. A Figura 10-3 mostra algumas substituições de peças que você poderia fazer para converter o atual sistema de segurança do gabinete em um que vai proteger um objeto de estar a céu aberto. Esse sistema modificado pode, em vez detectar movimentos na sala, também detectar se alguém levanta o objeto que você deseja proteger: • • Botão de pressão: saída alta-baixa → substitua pelo Sensor de movimento PIR Potenciômetro: resistor variável → substitua pelo Sensor FLEXIFORCE O sensor PIR detecta mudanças nos padrões de luz infravermelha passiva na área circundante, e envia um sinal de alta para indicar que o movimento foi detectado, ou envia um sinal de baixa para indicar que não houve nenhum movimento. A resistência do sensor FLEXIFORCE varia com a força aplicada no ponto redondo da extremidade (por exemplo, um objeto posicionado sobre ela), de modo que possa ser medida em um circuito RC com o comando RCTIME. Figura 10-3: Sensores para atualizar o sistema de alarme Sensor PIR Sensor FLEXIFORCE Vá para www.parallax.com e digite “motion detection” (detecção de movimento) no campo “Search” (pesquisa) e clique no botão “Go” (ir). Encontre o Sensor PIR nos resultados da pesquisa e vá para a página do produto. Baixe a documentação do Sensor PIR (.pdf) e, opcionalmente, assista ao vídeo do Sensor PIR. O arquivo PDF estará na seção Downloads da página. Leia as explicações da documentação, esquemas e exemplos de código PIR_Simple.bs2. Você pode substituir este sensor para um botão de pressão? Volte para os seus resultados de busca (ou para a página inicial da Parallax) e digite “pressure” (pressão) no campo de pesquisa. Então, siga o link do sensor FLEXIFORCE. Encontre-o e descompacte a Documentação de FLEXIFORCE e do códigofonte. Na pasta descompactada, abra e leia a documentação, o diagrama esquemático, e o código fonte do FLEXIFORCE Simple.bs2. Você pode substituir este sensor por um potenciômetro? Um exemplo passo-a-passo demonstra como as melhorias, tanto nesta como na próxima atividade em um aplicativo de sistema de seu micro alarme pode ser incorporado, siga o link Stamp in Class "Mini Projetos" em: www.parallax.com/Education. Página - 264 ATIVIDADE #6: SUPERANDO OBSTÁCULOS DO PROJETO Agora que você está prestes a terminar as atividades com o BASIC Stamp - Kit de Atividades, um dos passos mais importantes que você pode tomar é encontrar respostas para as tarefas que você ainda não sabe como resolver com o seu microcontrolador. Aqui estão as etapas gerais: Passo 1: Procure os componentes ou circuitos que poderiam resolver o seu problema. Passo 2: Leia sobre o componente/circuito e descubra como ele funciona. Preste especial atenção à forma como o BASIC Stamp seria necessário para interagir com o componente/circuito. Passo 3: Descubra se o exemplo de código está disponível para o circuito ou componente. Isso vai torná-lo muito mais fácil de ser incorporado à sua aplicação. Vamos dizer que o próximo passo em seu projeto é exibir o status do sistema, sem a conexão com o computador. Aqui está um exemplo de como você pode encontrar e avaliar um componente para sua aplicação. (Etapa 1) Vá para www.parallax.com e tente o termo "display" no campo de pesquisa. Na página inicial, você pode precisar clicar no botão Go em vez de apenas pressionar Enter. Vá para as páginas do produto dos vários itens resultantes da pesquisa e veja se você pode encontrar um que é relativamente barato e capaz de exibir algumas linhas de texto. Se você decidiu que o Parallax Serial 2x16 LCD na Figura 10-4 é um bom candidato, você está no caminho certo. No entanto, qualquer display funcionará. Figura 10-4 Parallax 2x16 Serial LCD (Passo 2) Vá para a página do produto Parallax Serial 2x16 LCD. Se você não tiver feito isso, leia a descrição do produto. Em seguida, localize o link da Documentação em PDF do Parallax Serial 2x16 de LCD. Vai estar na página “Downloads and Resources”, da seção, provavelmente, chamada "Parallax Serial 2x16 LCD Documentation v2.0 (.pdf)”. A versão 2.0 pode ser mais recente. (Passo 3) Verifique se há um exemplo de código na documentação em PDF do Parallax Serial 2x16 LCD, bem como links para download do código na página da web, seção Downloads and Resources. Procure um bom exemplo de programa que seja curto, simples e que exiba uma mensagem de teste, pois geralmente fornece um bom ponto de partida. Página - 265 Após a breve introdução ao SERIN e SEROUT no exemplo de programa deste capítulo, o exemplo de código para o Parallax Serial LCD, que se baseia em SEROUT, pode parecer bastante familiar. Se você seguir o link “Smart Sensors and Applications” (Sensores Inteligentes e Aplicativos), você pode baixar os sensores inteligentes e aplicativos dos livros didáticos, que têm um capítulo inteiro sobre como controlar esta exposição com o BASIC Stamp 2. Três Exemplos de Quantos Outros? Os sensores PIR e FLEXIFORCE e o LCD Serial Parallax são três exemplos de módulos e componentes que você pode usar para aumentar significativamente a funcionalidade do seu protótipo. Estes três são apenas uma gota no oceano em comparação com o que está disponível. A Figura 10-5 mostra mais alguns módulos e componentes, que são apenas uma pequena amostra. Os exemplos apresentados na figura são: (a) o módulo RF para comunicação de rádio, (b) giroscópio para detectar a velocidade de rotação, (c) bússola para encontrar direção, (d) sensor de vibração, (e) acelerômetro para detectar mudanças de inclinação e de velocidade, (f) sensor de ultrassom para detectar a distância, (g) sensor de intensidade de luz, (h) servo controlador, (i) controlador do motor DC, (j) matriz Darlington para conduzir as bobinas do motor de passo e (k) motor de passo. Você pode encontrar qualquer um destes dispositivos em www.parallax.com com uma pesquisa por palavra chave. Por exemplo, para saber mais sobre o (f) digite "sensor de ultrassom" no campo de busca da página principal da Parallax e, em seguida, clique no botão Ir (Go). Figura 10-5: Mais Módulos e Exemplos de Acessórios Controles de Motor Sensores Comunicação b e h j a c f k i d g Sua Vez - Investigando Mais Recursos Se você tem um projeto em mente e precisa encontrar um circuito e um código para suportar uma das características do seu projeto, o processo de pesquisa que acabamos de discutir fornece um bom ponto de partida, mas as páginas de produtos são encontradas Página - 266 somente em www.parallax.com, e há uma série de questões de projetos que as páginas de produtos não terão a solução. Felizmente, existem muitos mais recursos, incluindo: • • • • Stamps in Class em livros didáticos em PDF; Documentação do produto Parallax em PDF; Respostas às perguntas e artigos nos fóruns parallax.com; Artigos do BASIC Stamp publicados na Internet. Quando você estiver à procura de componentes e informações sobre como usá-los com o BASIC Stamp, eles se enquadrarão na categoria de “informações do aplicativo”. Ao procurar informações sobre o aplicativo, é melhor começar com o site do fabricante, em seguida, expandir a pesquisa para incluir os fóruns, e se você ainda não encontrou uma boa solução, tente expandi-la ainda mais incluindo a internet. A Figura 10-6 mostra um exemplo de pesquisa de palavras chaves no Google que vai procurar os termos "infravermelho" e "remoto" em documentos em PDF e em páginas de produtos no www.parallax.com. O importante aqui é que o Google procura documentos PDF em vez de apenas páginas de produtos. Certifique-se de que não há espaços ao digitar o site: www.parallax.com. Figura 10-5 Pesquisa no Google no site www.parallax.com Você pode modificar a pesquisa para incluir perguntas e respostas nos fóruns de suporte da Parallax, alterando o "www" para "foruns" como este: infrared remote site:forums.parallax.com Este fórum procura por todas as perguntas, respostas e artigos curtos que contenham as palavras "infravermelho" e "remoto" em foruns.parallax.com. Para encontrar um aplicativo específico para o BASIC Stamp, mude a sua pesquisa para os termos abaixo. Certifique-se que as palavras BASIC Stamp estejam entre aspas para filtrar a coleta de resultados. Aqui está um resumo das sequências de pesquisa do Google para "BASIC Stamp” infravermelho remoto. site infravermelho remoto: www.parallax.com o Pesquise os termos "infravermelho" e "remoto" em PDF e páginas de produto em www.parallax.com site infravermelho remoto: foruns.parallax.com o Pesquise os termos "infravermelho" e "remoto" em discussões nos fóruns parallax.com “BASIC Stamp” infravermelho remote o Busque na rede mundial de computadores as palavras “infravermelho” (“infrared”) e “remoto” (“remote”) na mesma página em PDF com a frase "BASIC Stamp". Página - 267 Vamos dizer que o próximo passo, para o seu projeto de Alarme, seja um teclado. Mas a documentação e exemplos que você encontrou com uma simples pesquisa na página do produto em parallax.com acabou por ser escassa e desprovida de exemplos de circuitos e código. Supondo que algumas pesquisas estariam em ordem, vamos tentar uma pesquisa no Google no site da Parallax para todas as referências de teclado. Lembre-se, a busca no Google inclui documentos em PDF. Vá para www.google.com. Digite “keypad site:www.parallax.com” dentro do campo Search e pressione Enter. Para filtrar os resultados é necessário um pouco de paciência e persistência, pois pode haver muitas páginas de resultados. Normalmente há trechos suficientes de cada resultado de busca para obter algum contexto para cada link. Isto lhe dará uma ideia de quais ignorar e quais devem ser levados em conta. Depois de algumas páginas, você pode encontrar e seguir o link do kit de Peças do Controle Remoto IR, mostrado na Figura 10-7. Isto pode não ser a solução que você estava esperando, mas depois de examinar o preço, documentação e código de exemplo, ele pode ter um grande potencial para o seu sistema de segurança com teclado. Figura 10-6: Kit de Peças do Controle Remoto IR Se depois de tudo isso, você ainda não encontrou a informação que você precisa, é hora de ir aos fóruns da parallax.com. Quando você postar uma pergunta lá, ela será vista por especialistas em uma variedade de campos, bem como por professores, amadores e estudantes. A experiência coletiva dos Fóruns Parallax deve ser capaz de ajudá-lo em praticamente qualquer obstáculo do projeto! Processador de Memória e Obstáculos de Velocidade do Projeto Em alguns casos, programas para projetos maiores podem crescer o suficiente e ultrapassar a memória de programa do BASIC Stamp 2. Este obstáculo do projeto pode, às vezes, ser saltado reescrevendo o código, para trabalhar mais com menos comandos. Outra opção é fazer a atualização para um modelo BASIC Stamp com uma memória de programa maior. Em outros casos, o projeto pode envolver uma maior armazenagem de valores do que o BASIC Stamp 2 pode acomodar. Há também modelos do BASIC Stamp 2 que apresentam memória de rascunho RAM para os valores das variáveis. Outros projetos podem precisar fazer mais tarefas em menos tempo do que o BASIC Stamp 2 foi projetado para fazer, por isso alguns modelos do BASIC Stamp 2 são projetados com velocidades de processamento mais rápidas. A Figura 10-8 mostra todos os diferentes modelos BASIC Stamp. Para obter detalhes sobre um, siga o link "Comparar módulos BASIC Stamp" no www.parallax.com/BasicStamp. Página - 268 Figura 10-7: Linha completa de modelos BASIC Stamp A partir da esquerda: BS1, BS2, BS2E, BS2SX, BS2P24, BS2P40, BS2pe, BS2px BS1: Econômico, mas capaz, perfeito para pequenos projetos ou espaços apertados. BS2: Ideal para iniciantes, com uma vasta base de recursos de código de amostra; o coração dos programas Stamps Class. BS2E: Perfeito para usuários do BS2 que precisam de mais espaço no programa e variável. BS2SX: Suporta o conjunto de comandos BS2 com mais variáveis e espaço no programa em mais de duas vezes a velocidade de execução. BS2P24: Além de mais velocidade e espaço variável, comandos especiais apoiam o polling I/O, caracteres LCDs e protocolos I2C e 1-fio. BS2P40: Todos os recursos do BS2P24 com um banco de 16 pinos de I/O adicionais. BS2pe: Suporta o comando BS2P24 emparelhado com menor consumo de energia e mais memória para aplicações de registro de dados movidos a bateria. BS2px: O mais rápido modelo BASIC Stamp BS2P24, suporta todos os comandos, além de recursos especiais de configuração de I/O. Uma coisa a ter em mente é que se você atualizar para um modelo mais rápido do BASIC Stamp existirão diferenças de unidades de comandos sensíveis ao tempo como RCTIME e FREQOUT. Uma vez que os processadores de diferentes modelos decorrem em velocidades diferentes, as unidades de duração e frequência e outros argumentos podem ser diferentes. Por exemplo, quando BS2 executa FREQOUT 6, 100, 4500, ele envia um sinal de alarme estridente de P6 para 100 ms (1/10 de um segundo) a uma frequência de 4500 Hz. O mesmo comando executado pelo BS2px envia um tom que dura apenas 16,6 ms com uma frequência de 27.135 Hz, tão agudo que não é audível aos ouvidos humanos! Para uma descrição completa de como cada comando funciona em cada modelo, e para obter dicas sobre a conversão de programas BS2 para executar corretamente em outros modelos, consulte a ajuda do BASIC Stamp Editor. Processamento Paralelo de Alto Desempenho Alguns aplicativos complexos exigem agilidade de processamento e memória que está bem além das linhas de capacidade do BASIC Stamp 2. Estes são os tipos de projetos que o microcontrolador Propeller é projetado para fazer. Este microcontrolador único, capaz, tem oito processadores muito mais velozes em um único chip, juntamente com 32 pinos de I/O e amplo programa de memória, e memória RAM. Os processadores podem operar ao mesmo tempo, tanto de forma independente e cooperativamente, partilhando a memória de acesso mundial e um relógio do sistema. Cada processador tem a sua própria memória e hardware adicional para executar tarefas complexas, como monitorar o estado de alta velocidade do pino de I/O, ou gerar sinais para uma tela de televisão ou computador. Página - 269 O Propeller Education - Kit Educacional mostrado na Figura 10-9 é uma boa maneira de começar a trabalhar com o microcontrolador Propeller. Este kit não é necessariamente o melhor próximo passo depois do BASIC Stamp - Kit de Atividades. A próxima atividade tem algumas boas recomendações para as próximas etapas do livro/kit. No entanto, quando você perceber que seus projetos estão ficando mais ambiciosos e exigentes, lembre-se do microcontrolador Propeller e do Propeller Education - Kit Educacional. Figura 10-8 Propeller Education - Kit Educacional (à esquerda) e Plataforma PE (à direita) ATIVIDADE #7: QUAL SERÁ A PRÓXIMA? Agora que você está prestes a terminar BASIC Stamp - Kit de Atividade é hora de pensar sobre o que aprender em seguida. Antes de continuar, tire um tempo para considerar em que mais você está interessado. Algumas categorias gerais que você futuramente pode se aprofundar ainda mais, incluem: • • • • • • Robótica; Eletrônica; Sensores; Automação; Projetos de Diversão; Ciências da Terra e medições climáticas. Esta atividade levantou recursos que você pode usar para avançar com cada uma dessas categorias. Os recursos, kits e componentes discutidos nesta atividade foram atualizados quando este capítulo foi escrito (2009). As melhores e mais recentes versões dos recursos, kits e componentes podem se tornar disponíveis e substituir as informações aqui apresentadas. Certifique-se de verificar www.parallax.com para últimas informações. O que é um Microcontrolador? - Sequência A Figura 10-10 mostra os 10 livros e kits que fazem as melhores sequências para este livro. Robótica com o Boe-Bot é muito divertido e um grande aprendizado, porque você começa a aplicar muitas das técnicas deste livro para aplicações robóticas com o robô Boe-Bot. Sensores inteligentes e Aplicações foram escritos para ser "O que é um microcontrolador, parte 2". Foi rebatizado porque todos os elegantes sensores e visor de Página - 270 cristal líquido mostrado no centro da Figura 10-10 têm coprocessadores que se comunicam com o BASIC Stamp. Os coprocessadores fazem-no sensores "inteligentes". Sinais de entendimento são ótimos porque permitem "ver" as interações entre o BASIC Stamp e os circuitos com um osciloscópio da Parallax que você pode conectar na porta USB do seu computador. Figura 10-9: Grandes próximos passos após “O que é um microcontrolador?” Kit do Robô Boe-Bot Sensores Inteligentes e Aplicação de Peças de Teste Entendendo sinais, peças e texto Stamps in Class e Mais Livros Didáticos A Figura 10-11 mostra um fluxograma que descreve todos os kits de Stamps in Class e livros didáticos disponíveis no momento da redação desse texto. Estão acessíveis através da Visão Global do Programa Stamps in Class (Stamps in Class Program Overviews) e do link Fluxograma (Flowchart) no www.parallax.com/Education, e você pode clicar em cada foto para visitar a página do produto no livro e o kit que acompanha. O que é um Microcontrolador? está no canto superior esquerdo da figura. A partir daí, o fluxograma indica que você pode saltar para Robótica com o Boe-Bot ou qualquer texto/kit nos sensores ou série de sinais. Download completo de livros didáticos em PDF: Você pode fazer o download de todo o PDF totalmente colorido de cada Stamp in Class em www.parallax.com. Clique em qualquer uma das fotos do gráfico para navegar até a página do texto + Kit, e você vai encontrar o link em PDF na seção de Downloads da página. Página - 271 Figura 10-10 Fluxograma do Stamps in Class Se a categoria que você está interessado é: • Robótica, então, o próximo passo é definitivamente Robótica com o Boe-Bot. • Sensores, inventos ou projetos de diversão, então o próximo passo seria Sensores inteligentes e aplicações. • Eletrônicos (sinais), então o próximo passo seria Entendendo Sinais. • Automação, então o próximo passo seria Controle de Processos. • Ciências da Terra e medições climáticas, então o próximo passo seria Sensores Aplicados. Recurso Adicionais dos Stamps In Class Além do que está nos livros didáticos Stamps in Class, existem “Mini Projetos” Stamps in Class linkados no www.parallax.com/Education. Alguns projetos utilizam apenas as peças em estoque de um determinado kit, mas demonstram novas maneiras de usá-las, juntamente com novos conceitos. Muitos desses projetos são como capítulos completos dos livros didáticos Stamps in Class com atividades, esquemas, diagramas de fiação, e listagens de código completas que podem ser baixadas. Alguns até têm tutoriais em vídeo que acompanham. A Figura 10-12 é retirada do vídeo do projeto “Construa seu próprio mini temporizador ("Build Your Own Mini timer"), que pode ser feito apenas com as peças que você tem usado neste livro. Se você está procurando mais informações ou uma inspiração criativa, você pode encontrá-la aqui. Página - 272 Figura 10-11: Exemplo do “Mini Projeto” Stamps in Class SUMÁRIO Este livro introduziu uma variedade de circuitos e técnicas de todos os que são blocos de construção em produtos comuns, bem como nas invenções. Este livro também apresentou técnicas para orquestrar os vários blocos de construção com o microcontrolador BASIC Stamp. Este capítulo demonstrou como incorporar essas técnicas e blocos de construção em um protótipo, e também recomendou alguns próximos passos para aprender mais na sua área de interesse. A abordagem para fazer o BASIC Stamp interagir com um determinado circuito pode ser aplicada a uma variedade de outros circuitos e módulos para realizar uma gama ainda mais vasta de tarefas. Foram aplicados dois exemplos ao protótipo de alarme: (1) com um sensor de movimento de uma interface semelhante a um botão de pressão e (2) um sensor de pressão com uma interface semelhante ao potenciômetro. Ao desenvolver o código para sua aplicação, certifique-se de salvar seu trabalho com frequência sob os nomes de revisão incrementados. Além disso, certifique-se de usar nomes significativos para os pinos de I/O e números com as diretivas PIN e CON. Por último, acrescente muitos comentários ao seu código, explicando o que ele faz e como ele faz isso. Sub-rotinas devem incluir comentários que explicam o que a rotina faz com todas as variáveis com valores que ele usa para fazer seu trabalho, bem como as variáveis em que os resultados são armazenados quando a sub-rotina está pronta. Este capítulo também introduziu uma variedade de técnicas de pesquisa para programar recursos em seu protótipo. Mesmo se você começar sem nenhuma pista sobre como fazer um trabalho com uma característica peculiar, você pode usar termos de pesquisa para encontrar exemplos úteis de componente, circuito e código. Livros didáticos e kits do Stamps in Class também apresentam uma grande variedade de circuitos e técnicas úteis de design, e eles são um ótimo lugar para aprender mais nas áreas de robótica, Página - 273 sensores, eletrônica, automação, ciências da terra, e muito mais. Todos os livros que vêm com kits Stamps in Class têm downloads gratuitos. Agora que você chegou ao final deste livro, tire um momento para pensar em quatro coisas: (1) nas técnicas que você aprendeu, (2) na sua próxima invenção, projeto ou protótipo, (3) como pode ser aplicado o que você aprendeu e (4) o que você quer aprender a seguir. Agora, é hora de começar a fazer o seu próximo projeto ou protótipo. Certifique-se de continuar estudando e aprendendo novas técnicas conforme você for fazendo. Divirta-se e boa sorte! Página - 274 Apêndice A: Lista de Peças e Opções de Kit Kit de Peças e Livro #28152, Apenas Peças #28122 de “O que é um Microcontrolador?” Peças e quantidades estão sujeitas a alterações sem aviso prévio Peças Descrição Quantidade Parallax # 150-01020 Resistor, 5%, 1/4W, 1 kΩ 10 150-01030 Resistor, 5%, 1/4W, 10 kΩ 4 150-01040 Resistor, 5%, 1/4W, 100 kΩ 2 150-02020 Resistor, 5%, 1/4W, 2 kΩ 2 150-02210 Resistor, 5%, 1/4W, 220 Ω 6 150-04710 Resistor, 5%, 1/4W, 470 Ω 6 152-01031 Potenciômetro - 10 kΩ 1 200-01031 Capacitor, 0.01 µF 2 200-01040 Capacitor, 0.1 µF 2 201-01080 Capacitor, 1000 µF 1 201-03080 1 350-00001 Capacitor 3300 µF Livro “O que é Microcontrolador?” (apenas no #28152) LED - Verde - T1 3/4 350-00005 350-00006 350-00007 350-00027 350-00029 400-00002 LED - Bicolor - T1 3/4 LED - Vermelho - T1 3/4 LED - Amarelo - T1 3/4 Display de LED de 7 segmentos Fototransistor, 850 nm, T1 3/4 Botão – Normalmente aberto 1 2 2 1 1 2 451-00303 500-00001 3 cabeçalho de Pino – Macho/Macho Transistor – 2N3904 1 1 604-00010 Potenciômetro digital de 10 kΩ Fios de 3” – Saco com 10 Alto-falante 1 800-00016 900-00001 900-00005 Servo Padrão Parallax 1 28123 1 2 2 1 Página - 275 OPÇÕES DE KIT COMPLETO Existem várias opções de kits disponíveis que incluem a placa de desenvolvimento do microcontrolador Basic Stamp 2 e todos os componentes eletrônicos para concluir as atividades neste texto: • Kit de atividades do BASIC Stamp (#90005) inclusos: o BASIC Stamp HomeWork Board com a superfície de montagem BS2 o USB para Adaptador Serial com cabo USB A para Mini-B (#28031) o “O que é Microcontrolador?” Peças e Livro (#28152) • Kit Descobrindo o BASIC Stamp (Serial #27207 ou USB #27807) inclusos: o Board of Education (Serial #28150 ou USB #28850) o Módulo do microcontrolador BASIC Stamp 2 (#BS2-IC) o Cabo de Programação (Serial #800-00003 ou USB A para Mini-B #805-00006) o “O que é Microcontrolador?” Peças e Livro (#28152) o Manual do BASIC Stamp (#27218) • “O que é Microcontrolador?” Peças e Livro (#28152). PLUS • Kit completo do Board of Education (Serial #28103 ou USB #28803) inclusos: o Board of Education (Serial #28150 ou USB #28850) o Módulo do microcontrolador do BASIC Stamp 2 (#BS2-IC) o Cabo de Programação (Serial #800-00003 ou USB A para Mini-B #805-00006) o Fios (1 pacote com 10 Nota para os Educadores: descontos nas compras em quantidade estão disponíveis para todos os kits listados acima. Consulte a página de produtos de cada kit em www.bseducacional.com.br para mais informações. Além disso, o BASIC Stamp HomeWork Board está disponível separadamente em embalagens de 10, como uma solução econômica para o uso em sala de aula, com um custo significativamente menor do que o Board of Education + BASIC Stamp 2 módulo (#28158). Para preços em compras maior quantidade, por favor, entre em contato com a Equipe de Vendas da BS Educacional através do telefone +55 (11) 2533 9. Página - 278 Apêndice B: Mais Informações Sobre Eletricidade O que é um elétron? Um elétron é uma das três partes fundamentais de um átomo, os outros dois são os prótons e neutrons. Um ou mais prótons e neutrons se unem no centro da molécula numa área chamada núcleo. Os elétrons são muito pequenos em comparação com os prótons e neutrons, e orbitam ao redor do núcleo. Os eletrons repelem-se mutuamente, mas eletrons e protons atraem uns aos outros. O que é uma carga? A tendência de um elétron se repelir a partir de um outro elétron e atrair um próton próximo é chamada de carga negativa. A tendência de um próton repelir outro próton e atrair um elétron é chamada de carga positiva. Quando uma molécula possui mais elétrons do que prótons, ela será carregada negativamente. Se uma molécula tem menos elétrons do que prótons, ela será carregada positivamente. Se uma molécula tem o mesmo número de prótons e elétrons, é chamada de carga neutra. O que é uma voltagem? A voltagem é como a pressão elétrica. Quando uma molécula carregada negativamente está perto de uma molécula carregada positivamente, o eletron extra na molécula carregada negativamente tenta obter a partir da molécula carregada negativamente para a molécula carregada positivamente. As baterias mantém uma composição com as moléculas carregadas negativamente, separadas a partir de uma composição com as moléculas carregadas positivamente. Cada uma destas composições encontra-se ligada a um dos terminais da bateria; a composição carregada positivamente está ligada ao terminal positivo (+), e a composição negativa está ligado ao terminal negativo (-) do terminal. O volt é uma medida de pressão elétrica, e é abreviado com uma letra maiúscula V. Você já deve estar familiarizado com a bateria de nove volts (9 V) usada para fornecer energia para o Board of Education ou HomeWork Board. Outras baterias comuns incluem as baterias de 12 V encontradas em carros e nas pilhas de 1,5 V AA usadas em calculadoras, jogos portáteis e outros dispositivos. O que é uma corrente? Corrente é a medida do número de elétrons por segundo que passa através de um circuito. Algumas vezes, a ligação de moléculas de uma reação química cria uma composição (que tem carga neutra). Outras vezes, o elétron deixa a molécula carregada negativamente e se junta à molécula carregada positivamente, passando pelo circuito como o que você acabou de construir e testar. A letra mais comumente usada para se referir a corrente nos esquemas e livros é a letra maiúscula "I." O que é um amp? Um amp (abreviação de ampere) é a unidade básica da corrente, e a abreviação para amp é a letra maiúscula "A." Em comparação com os circuitos que você está usando com o BASIC Stamp, um amp é uma quantidade muito grande de corrente. É um valor conveniente para descrever a quantidade de corrente que a bateria de um carro fornece para os faróis, para o ventilador que resfria o motor de um carro , e outros dispositivos de alta potência. Medições de miliampéres (mA) e microampéres (uA) são mais convenientes para discutir a corrente de alimentação do módulo BASIC Stamp, bem como as correntes entre os pinos e circuitos de I/O. 1 mA = 1/1, 000 A, e 1 mA = 1/1, 000,000 A. O que é uma resistência? A resistência é a tendência de um elemento de um circuito Página - 279 para resistir ao fluxo de elétrons ( corrente) de um terminal negativo da bateria para o terminal positivo. O ohm é a medida básica da resistência .Ele já foi introduzido e é abreviado com a letra grega ômega ( Ω ). O que é um condutor? É o fio de cobre que tem quase nenhuma resistência, e é. ATIVIDADE BÕNUS: LEI DE OHM, VOLTAGEM E CORRENTE Aplica-se a esta atividade algumas das definições que acabamos de discutir. Peças - Lei de Ohm (1) Resistor – 220 Ω (vermelho-vermelho-marrom) (1) Resistor – 470 Ω (amarelo-violeta-marrom) (1) Resistor – 1 kΩ (marrom-preto-vermelho) (1) Resistor – 2 kΩ (vermelho-preto-vermelho) (1) LED – qualquer cor Circuito de Teste O valor da resistência Ri na Figura B-1 pode ser alterado. Uma menor resistência permite mais corrente através do LED, e ele vai brilhar com mais intensidade. Os valores mais elevados de resistência farão com que o LED pareça escuro porque eles não permitem a passagem de muita corrente através do circuito. Desligue a energia do seu Board of Education ou HomeWork Board sempre que você modificar o circuito. Construa o circuito mostrado na figura B-1 começando com um resistor de 220 Ω. Modifique o circuito, substituindo o resistor de 220 Ω por um resistor de 470 Ω. O LED ficou menos brilhante? Repita usando o resistor de 1 Ω., em seguida use um resitor de 2 Ω., verifique a variação de brilho cada vez. Vdd X3 Vdd R1 R 2 R 3 R 4 Ri LED Vss R1 = 220 Ω R2 = 470 Ω R3 = 1 k Ω R4 = 2 k Ω P15 P14 P13 P12 P11 P10 P9 P8 P7 P6 P5 P4 P3 P2 P1 P0 X2 Vin Vss + Figura B-1 LED Monitor de Corrente Se você estiver usando uma bateria de 9 V, você também pode comparar o brilho de uma fonte de voltagem diferente, Vin. Vin está conectado diretamente ao terminal + da bateria de 9 V, e Vss está conectado diretamente ao terminal negativo da bateria. Em Página - 280 nosso sistema, Vdd está regulado a 5 V. Isso é cerca de metade da voltagem da bateria de 9 V. Se você não estiver usando uma bateria de 9 V, pare por aqui e pule para o cálculo de corrente da seção abaixo. Caso contrário, continue. Comece com o circuito mostrado na figura B-1, mas use um resistor de 1 kΩ. Anote quão brilhante o LED está Desconecte a energia. Modifique o circuito, desligando o resistor principal de Vdd e coloque-o em Vin.. Quando você reconecta a energia o LED está mais brilhante? Quanto mais brilhante? Não tente fazer a experiência Vin com um resistor de 220 ou 470 Ω, pois ele irá alimentar o LED como mais corrente do que ele está classificado. Calculando a Corrente O manual do BASIC Stamp tem algumas regras sobre a quantidade de corrente que os pinos de I/O podem fornecer aos circuitos. Se você não seguir estas regras, você pode acabar prejudicando o seu BASIC Stamp. As regras têm a ver com a quantidade de corrente que um pino ou um grupo de pinos de I/O pode entregar. Regras atuais para pinos de I/O do BASIC Stamp • Um pino de I/O pode ter uma "fonte" de até 20 mA. Em outras palavras, se você enviar um sinal de alta para um pino de I/O, ele não deve alimentar o circuito de LED, com mais de 20 mA. • Se você religar o circuito de LED para que o BASIC Stamp faça o LED acender, quando você enviar o comando LOW, o pino de I/O pode "afundar" até 25 mA. • P0 até P7 só pode utilizar até 40 mA. Da mesma forma com P8 até P15. 40 mA também é a corrente fornecida ao pino de I/O estimada para o regulador do módulo 25 V do BASIC Stamp , de modo que o consumo total de corrente de todos os pinos de I/O não devem nunca exceder 40 mA. Se você tem muitos circuitos de LED, você precisará de resistores maiores para que os circuitos não puxem muita corrente. • Para mais informações, consulte a tabela de descrição dos pinos do BASIC Stamp 2 no no Manual BASIC Stamp. Se você sabe como calcular a quantidade de corrente que o seu circuito vai usar, então você consegue decidir se tudo bem seu LED brilhar com essa intensidade específica. Cada componente tem suas próprias regras no que diz respeito à voltagem, resistência e corrente. Para o diodo emissor de luz, a regra é um valor chamado de voltagem direta do diodo. Para o resistor, a regra é chamada Lei de Ohm. Há também regras para adicionar voltagem e corrente nos circuitos. Estas são chamadas de Leis de Voltagem e Corrente de Kirchhoff. Página - 281 Vdd - Vss = 5 V A voltagem (tensão elétrica) de Vdd para Vss é de 5 V. Isto é chamado de voltagem regulada, e ela funciona mais ou menos como uma bateria que fornece exatamente 5 V. (As baterias não são tipicamente de 5 V, embora quatro baterias de 1,2 V de níquel-cádmio recarregáveis em série podem adicionar até 4,8 V.) O Board of Education e o BASIC Stamp HomeWork Board ambos têm reguladores de 5 V que convertem a bateria de 6 a-9 V para fornecer voltagem ao regulador de 5 V para as tomadas de Vdd acima da breadboard. O BASIC Stamp, também tem um regulador de voltagem embutido que converte a entrada de 6 a 9 V para 5 V, para os seus componentes. Vin - Vss = 9 V Se você estiver usando bateria de 9 V, a voltagem de Vin para Vss é de 9 V. Tenha cuidado. Se você estiver usando um regulador de voltagem que se conecta à parede, mesmo que ele diga 9 V, poderia ir tão alto como 18 V. Terra e / ou referência referem-se ao terminal negativo de um circuito. Quando se trata do BASIC Stamp e do Board of Education, Vss é considerado a referência de terra. É zero volts, e se você estiver usando uma bateria de 9 V, é o terminal negativo dessa bateria. O terminal positivo da bateria é de 9 V. VDD é de 5 V (acima da referência Vss de 0 V), e é uma voltagem especial feita por um chip regulador de voltagem que fornece energia ao BASIC Stamp. Lei de Ohm: V = I x R A voltagem medida entre os terminais de um resistor (V) é igual a passagem de corrente através do resistor (I) multiplicada pela resistência (R). Diode envia voltagem: A voltagem entre o ânodo de um diodo e o cátodo como corrente passa através dele do ânodo para o cátodo. Para o circuito do LED verde na Figura 2- 6 na página 33, você pode assumir que a voltagem enviada através do LED é de aproximadamente 2,1 V para o caso de fazer os cálculos do circuito. Se o LED estiver amarelo assume 2,0 V, e se ele estiver vermelho, assume 1,7 V. Estas voltagens irão variar um pouco com a quantidade de corrente que passa através do circuito. Menor resistência em série e / ou maior voltagem aplicada ao circuito resulta num fluxo de corrente mais elevado. Maior resistência em série e / ou menor voltagem aplicada resulta em menores fluxos de corrente. Lei de voltagem de Kirchhoff simplificada: voltagem utilizada é igual a voltagem fornecida. Se você alimentar um circuito com 5 V, o número de volts para todas as peças ficará melhor se adicionar até 5 V. Lei de corrente de Kirchhoff simplificada: A corrente que entra é igual à corrente que sai. A corrente que entra a partir de um circuito de LED Vdd é a mesma quantidade de corrente que sai através Vss. Além disso, se você conectar três LEDs para o BASIC Stamp, e cada circuito de LED atrair 5 mA, significa que o BASIC Stamp tem que fornecer todos os circuitos com um total de 15 mA. Exemplo de Cálculo: um Circuito, dois Circuitos. Dois passos para calcular a quantidade de corrente que um circuito de LED vermelho atrai: 1. Descobra a voltagem sobre o resistor 2. Use a Lei de Ohm para descobrir a corrente através do resistor. A Figura B-2 mostra como calcular a voltagem através do resistor. A voltagem fornecida que está do lado esquerdo é de 5V. As voltagens usadas por cada componente estão à direita do circuito. A voltagem, nós não sabemos no início se é VR, a voltagem Página - 282 através da resistência. Mas, sabemos que a voltagem sobre o LED vai ser de cerca de 1,7 V (voltagem direta do LED vermelho). Sabemos também que a voltagem entre as partes tem que adicionar até 5 V por causa da lei de voltagem de Kirchhoff. A diferença entre 5 V e 1,7 V é de 3,3 V, esta é a voltagem através da resistência de VR. VR + 1.7 V = 5 V VR = 5 V − 1.7 V VR = 3.3 V Figura B-2 Voltagem através do circuito, do resistor e do LED Quilo é métrica para 1000. A forma métrica de dizer 1000 é quilo, e é abreviada com a minúscula k. Em vez de escrever 1000Ω, você pode escrever 1kΩ.De qualquer maneira, é1kΩ. é pronunciado um kilo-ohm. . Da mesma forma, 2000Ω é escrito 2kΩ. Mili é métrica para 1/1000, e é abreviado com um m minúsculo. Se o BASIC Stamp alimenta o circuito de LED com 3,3 milésimos de um ampere, são 3,3 miliamperes, ou 3,3 mA. O que é um mA? Pronuncia-se miliamper, é a abreviatura de um-milésimo-de um amper. O "m" 'em mA é a abreviação métrica para mili, que representa 1/1000. O "A" em mA significa amperes. Coloque os dois juntos, e você tem miliamperes, e é muito útil para descrever a quantidade de corrente consumida pelo BASIC Stamp e para os circuitos ligados a ele. Agora que já calculamos a voltagem através do resistor, a Figura B-3 mostra um exemplo de como utilizar esse valor para calcular a passagem de corrente através do resistor. Comece com a Lei de Ohm: V = I × R. Você sabe as respostas para V (3,3 V) e R (470 Ω). Agora, tudo que você tem a fazer é resolver para I (a corrente). V = I×R 3.3 V = I × 470 Ω 3.3 V I= 470 Ω I ≈ 0.00702 V Ω I = 0.00702 A 7.02 A 1000 I = 7.02 mA I= Figura B-3 Calculando corrente através do resistor Página - 283 Sim, é verdade! 1 A = 1 V /Ω (Um amp é um volt por ohm). Quanta corrente tem 7,02 mA? É a quanitdade de corrente que o circuito de LED na Figura B-2 conduz. Você pode substituir o resistor de 470Ω por um de 220 Ω e o circuito vai conduzir cerca de 15,0 mA, e o LED acenderá mais intensamente. Se você usar um resistor de 1000 Ω , o circuito vai conduzir 3,3 mA, e o LED acenderá menos intensamente. Se você usar um resistor de 2000Ω fará com que o LED brilhe menos intensamente ainda, e a corrente será 1,65 mA. Vamos dizer que você quer fazer que um pino de I / O ligue dois LEDs ao mesmo tempo. Isso significa que, no interior do BASIC Stamp, ele alimentaria os circuitos, conforme mostrado na Figura B-4. Poderia o circuito de corrente estimado exceder o limite de 20 mA do pino de I/O? Vamos descobrir. Lembre-se que a versão simplificada da lei de corrente de Kirchhoff diz que a corrente total consumida da fonte é igual a corrente fornecida a todos os circuitos. Isso significa que I na figura B-4 tem de ser igual ao total das duas correntes estimadas. Basta somar as duas correntes estimadas, e você vai ter uma resposta de 14,04 mA, que você pode arredondar para 14,0 mA. Uma vez que este consumo de corrente ainda está abaixo do limite de 20mA do pino de I / O, pode seguramente ser conectado a um pino de I / O e ligado / desligado com o BASIC Stamp. I = I 1 + I 2 + ... I i I = 7.02 mA + 7.02 mA I = 14.04 mA ≈ 14.0 mA Figura B-4 Corrente total fornecida a dois circuitos de LED Sua Vez – Modificando o Circuito Repita o exercício na Figura B-2, mas use Vin - Vss = 9 V em vez de Vdd - Vss = 5 V. Assumindo que a voltagem enviada não se altera, a resposta é VR = 7,3 V. A medida da voltagem do resistor será provavelmente um pouco menos pois quanto maior voltagem do LED mais passagem de corrente através do circuito.. Repita o exercício na Figura B-3, mas use um resistor de 1 kΩ. Resposta: I = 3.3 mA. Use VR = 7,3 V para fazer o exercício na Figura B-3 com um resistor de 1 kΩ. Resposta: I = 7.3 mA. Página - 284 Repita o exercício mostrado na Figura B-4 com um resistor de 470 Ω e o outro de1 kΩ. Resposta: I = 7.02 mA + 3.3 mA = 10.32 mA. Página - 285 Apêndice C: Sumário do Formato RTTTL Este é um resumo destinado a ajudar a entender o formato RTTTL. A especificação RTTTL completa pode ser encontrada em vários sites. Com qualquer mecanismo de busca, use a palavra-chave "especificação RTTTL" para rever as páginas da web que incluem a especificação. Aqui está um exemplo de um formato de toque em RTTTL: Leve-me ao jogo de bola : :d=4,o=7,b=225:2c6,c,a6,g6,e6, 2g.6,2d6,p,2c6,c,a6,g6,e6,2g.6,g6,p,p,a6,g#6,a6,e6,f6,g6,a6, p,f6,2d6,p,2a6,a6,a6,b6,c, d,b6,a6,g6 O texto antes do primeiro dos dois pontos é que o telefone celular mostra, como nome da canção. Neste caso, o toque é chamado: Leve-me ao jogo de bola: Entre o primeiro e o segundo dois pontos, as configurações padrão para a música são inseridas usando d, o, e b. Aqui está o que elas querem dizer: d – duração o – oitava b – batimentos por minuto ou ritmo. Em Leve-me ao jogo de bola, as configurações padrão são: d=4,o=7,b=225: As notas da melodia são inseridas após o segundo dois pontos, e elas são separadas por vírgulas. Se for utilizada apenas a letra nota, essa nota será tocada para a duração padrão na oitava padrão. Por exemplo, a segunda nota em Leve-me ao jogo de bola é: ,c, Se não houver outras informações, ela será tocada com a duração padrão de uma semínima (d = 4), na sétima oitava (o = 7). A nota poderia ter até cinco caracteres entre as vírgulas, aqui está o que cada caractere especifica: ,duração nota sustenido ponto oitava, Por exemplo: ,2g#.6, … Significa tocar a meia nota sustenido G- para a duração de 1 ½ de meia nota, e tocála na sexta oitava. Aqui estão alguns exemplos de Leve-me ao jogo de bola: Página - 286 ,2g.6, – meia nota, G, pontilhado, sexta oitava ,a6, – duração padrão da semínima. Nota tocada na sexta oitava ,g#6, – duração de um quarto, nota g, sustenido (indicado por #), sexta oitava O caractere: ,p, … significa pausa, é usada para descanso. Com nenhuma informação extra, o p toca por padrão a duração de uma semínima. Você também pode tocar o valor de uma meia nota de descanso usando: ,2p, Aqui está um exemplo de um descanso pontilhada:: ,2p., Neste caso, o resto iria durar meia nota mais a duração de uma semínima. Página - 287 Peças e quantidades estão sujeitas a alterações sem aviso prévio. As peças podem diferir do que é mostrado na foto. Se você tem alguma dúvida sobre o seu kit, por favor, envie um e-mail para [email protected].