Atelier de Formação Iniciação à robótica móvel Bases de Programação Associação Nacional de Professores de Electrotecnia e Electrónica DEAR Robot Microcontrolador Circuito integrado em alta escala (VLSI) que incorpora a maior parte dos elementos que constituem um controlador e se destina a uma determinada tarefa. Costuma estar incorporado no dispositivo que controla (controlador embebido embedded controller). Aplicações indústria informática (periféricos: rato, teclado,...) electrodomésticos (fornos, máq. lavar, vídeos, etc) sistemas AVACs telecomunicações indústria automóvel Constituição Um microcontrolador dispõe normalmente dos seguintes elementos: processador ou CPU memória de dados (RAM) memória de programa (ROM/PROM/EPROM/EEPROM) linhas de entrada/saída (E/S) programáveis Constituição módulos de controlo de periféricos (portos série, paralelo,USB,I2C,etc.) gerador de impulsos de relógio temporizadores cão-de-guarda (watchdog) conversores A/D e D/A comparadores analógicos microprocessador vs. microcontrolador o microprocessador é um sistema aberto constrói-se um computador com as características desejadas juntando os módulos necessários o microcontrolador é um sistema fechado contem um computador completo e as suas prestações limitadas não se podem modificar Estrutura de um microprocessador bus de endereços P bus de dados bus de controle Memória controlador 1 controlador 2 periféricos periféricos Estrutura de um microcontrolador C periféricos periféricos Arquitectura interna de um microprocessador UCP bus comum de endereços Memória Instruções 8 bus de dados e instruções + dados Arquitectura “von Neumann” ou “Princeton” Arquitectura interna de um microcontrolador Memória bus de endereços de instruções 10 UCP bus de endereços de dados 9 de de Instruções Memória 14 bus de instruções 8 bus de dados Arquitectura “Harvard” dados Arquitectura interna de um microcontrolador RISC - Reduced Instruction Set Computer (35 no 16F84) versus CISC - Complex Instruction Set Computer (+150 no 8086) Arquitectura interna de um microcontrolador Memória de Programa Tipologia PROM (Programmable Read Only Memory) EPROM (Electrically PROM) OTP (One Time Programmable) EEPROM (Electrically Erasable PROM) FLASH Arquitectura interna de um microcontrolador Memória de Dados SRAM (Static RAM) EEPROM Arquitectura interna de um microcontrolador Programação linguagem assembly linguagens HLL (High Level Language): Pascal, Basic, JAL, C Compiladores vs. Interpretadores Picaxe 28X Características: 600 linhas código 21 pinos E/S 9-17 saídas 0-12 entradas 0-4 entradas A/D 2 saídas PWM Picaxe 28X Entradas Analógicas ou Digitais Pinos de Entrada/Saída configuráveis Pinos de Saída Pinos de Entrada/Saída configuráveis Picaxe 28X Entradas Analógicas A/D Pinos de Saída PWM Linguagens de programação PBasic (compatível com Basic Stamp). Ambiente integrado de desenvolvimento com suporte para programação gráfica por fluxogramas. Editor, compilador, programador,debugger e simulador incorporados. Lógica de Programação O paradigma “tradicional”: Pressupõe um modelo do mundo Sensores Interpretação dos sensores Modelo do Mundo Actuadores Execução Planeamento Lógica de Programação O paradigma das interacções prioritárias de Rodney Brooks Utiliza uma estratégia em que só os sensores são os iniciadores dos comportamentos. Os comportamentos são sistemas em camadas de controlo que funcionam em paralelo, cada vez que os sensores apropriados são activados. Um sistema de arbitragem de prioridades é utilizado para activar o comportamento dominante. Todos os comportamentos funcionam em paralelo, com os de mais alto nível a suprimirem o funcionamento dos de nível inferior. Lógica de Programação O paradigma das interacções prioritárias de Rodney Brooks Exemplo: Bumpers Sensor Cor Sensor Pista Sensor Escapar Detectar_Cor S SeguirPista Procedimento S Motores Actuador BASIC Programa = dados + instruções Elementos da Linguagem de Programação BASIC Símbolos Variáveis Constantes Instruções BASIC LABELS As labels (etiquetas) são usadas como marcadores em todo o programa. As labels são usadas para marcar uma posição para onde “saltar” no programa através de uma instrução goto, gosub ou outra instrução. Uma label pode ser qualquer palavra (não reservada) e pode conter dígitos e o carácter underscore ( _ ). As labels devem ter como carácter inicial uma letra (não um dígito), e são definidas com o sinal doispontos (:) a seguir ao nome. O sinal não é necessário quando a label faz parte integrante de instruções. BASIC O compilador não é case-sensitive (sensível a maiúsculas), pelo que podem ser usadas indiscriminadamente maiúsculas e minúsculas. Exemplo: ciclo: high 1 pause 500 low 1 PAUSE 500 goto Ciclo ; liga a saída 1 ; espera de 5 segundos ; desliga a saída 1 ; espera de 5 segundos ; salto para o início BASIC Espaços em branco e Sintaxe Whitespace (espaço em branco) é o termo utilizado pelos programadores para definirem a área branca na impressão de um programa. Nela se incluem os espaços, as tabulações e as linhas vazias. Qualquer uma delas pode ser utilizada no programa para o tornar mais compreensível e facilitar a leitura. Convencionou-se colocar as labels encostadas à esquerda. Todas as outras instruções devem ser espaçadas através da tecla de tabulação. Esta convenção torna o programa mais fácil de ler e de seguir. BASIC COMENTÁRIOS Os comentários começam por um apóstrofe (‘) ou ponto e vírgula (;) e continuam até ao fim da linha. A instrução REM pode também ser utilizada para inserir comentários. Exemplos: high 0 ‘coloca pin0 alto high 2 ;coloca pin2 alto REM coloca pin3 alto BASIC CONSTANTES As constantes podem ser declaradas de quatro modos diferentes: decimais, hexadecimais, binárias e ASCII. Os números decimais são escritos directamente sem qualquer prefixo. Os números hexadecimais (hex) são precedidos pelo sinal dólar ($). Os números binários são precedidos pelo sinal de percentagem (%). Os valores ASCII são colocados entre plicas (“). BASIC Exemplos: 100 $64 %01100100 “A” “Hello” B1 = B0 ^ $AA ‘ 100 em decimal ‘ 64 hex ‘ 01100100 binário ‘ “A” ascii (65) ‘ “Hello” – equivalente a “H”, “e”, “l”, “l”, “o”. ‘ ou exclusivo da ‘variável B0 com AA hex BASIC SÍMBOLOS Os símbolos podem ser associados a valores constantes, nomes alias (alternativos) para variáveis e endereços de programa. Os valores constantes e os nomes alias de variáveis são atribuídos fazendo seguir ao nome do símbolo o sinal de igual (=), seguido da variável ou constante. Os símbolos podem utilizar qualquer palavra que não seja reservada (instruções). Os símbolos podem conter letras e números, mas o primeiro carácter é obrigatoriamente uma letra. O uso dos símbolos não aumenta a dimensão do programa e torna-o mais legível. BASIC Os endereços de programa são atribuídos fazendo seguir o símbolo pelo sinal dois pontos (:). Exemplo: symbol LED_E = 7 ‘ define um pino de saída symbol CONTA = B0 ‘ define o símbolo de uma variável let CONTA = 200 ‘ carrega a variável com o valor ‘ 200 CICLO: ‘ define endereço de programa high LED_E pause CONTA ‘ liga a saída 7 ‘ espera 0,2 segundos (200 milisegundos) low LED_E pause CONTA goto CICLO ‘ desliga a saída 7 ‘ espera 0,2 segundos ‘salta para o início CICLO BASIC Compreendendo a memória do PICAXE A memória do PICAXE é constituída por três áreas diferentes. A quantidade de memória varia conforme o tipo de PICAXE. Memória de Programa A memória de programa é onde o programa é guardado após uma transferência (download). Tratase de uma memória rápida tipo FLASH, que se pode reprogramar até cerca de 100 000 vezes. O programa não se perde quando se desliga a alimentação, pelo que é executado assim que esta é ligada de novo. Não é normalmente necessário apagar um programa, pois cada novo download reprograma toda a memória. BASIC Num PICAXE28X pode carregar cerca de 600 linhas de programa. Este valor é aproximado, pois cada instrução ocupa espaços diferentes em memória. Para verificar a memória livre basta seleccionar o menu PICAXE>Check Syntax. Memória de Dados A memória de dados é um espaço adicional de memória do microcontrolador. Os dados também não são perdidos quando se desliga a alimentação. Em cada transferência de dados (download) esta memória é posta a 0. BASIC RAM (Variáveis) A memória RAM é usada para guardar dados temporários em variáveis durante a execução do programa. Esta memória perde toda a informação quando se desliga a alimentação. Existem três tipos de variáveis – usos gerais, armazenamento e funções especiais. BASIC Variáveis de Usos Gerais (GPR – General Purpose Registers) Existem 14 variáveis de usos gerais tipo byte. Estas variáveis byte são designadas b0 a b13. As variáveis tipo byte (8 bits) podem guardar números inteiros entre 0 e 255. Para números maiores podem combinar-se duas variáveis byte de modo a criar uma variável word, que é capaz de guardar números inteiros entre 0 e 65535. BASIC Estas variáveis word são designadas w0 a w6, e são construídas do seguinte modo: w0 = b1 : b0 w1 = b3 : b2 w2 = b5 : b4 w3 = b7 : b6 w4 = b9 : b8 w5 = b11 : b10 w6 = b13 : b12 BASIC Para além disso os bytes b0 e b1 (w0) podem ser divididos em variáveis bit. As variáveis bit podem ser utilizadas onde for necessário guardar um único bit (0 ou 1) numa variável b0 = bit7: bit6: bit5: bit4: bit3: bit2: bit1: bit0 b1 = bit15: bit14: bit13: bit12: bit11: bit10: bit9: bit8 Pode utilizar qualquer variável word, byte ou bit numa expressão matemática ou instrução que utilize variáveis. BASIC Variáveis para Funções Especiais (SFR) As variáveis disponíveis para funções especiais dependem do tipo de PICAXE. pins = representa o dado lido no porto de entrada pins = representa o porto de saída na escrita Note que pins é uma ‘pseudo’ variável que se pode aplicar tanto a portos de entrada como de saída. Quando usado à esquerda de uma expressão de atribuição de pinos aplica-se ao porto de saída. BASIC Por exemplo, let pins = %11000011 vai colocar as saídas 7,6,1,0 altas e as restantes baixas. O sinal % indica ao compilador que se está a trabalhar em binário, em vez de decimal. Quando usado à direita de uma expressão de atribuição de pinos aplica-se ao porto de entrada (porto C no PICAXE28X). Por exemplo, let b1 = pins vai guardar em b1 o estado actual do porto de entrada. BASIC A variável pins está separada em variáveis bit individuais para leitura de entradas bit individuais através da instrução if...then. pins = pin7 : pin6 : pin5 : pin4 : pin3 : pin2 : pin1 : pin0 Programming Editor Instalação e password (picaxebegin) Configuração (Menu View/Options) Mode PICAXE-28X Options: 4MHz Serial Port Language Programming Editor Programação em BASIC Programação por Fluxograma Programming Editor Programação por Fluxograma Simbologia Início/Fim Processo: acção a ser realizada E/S define entradas e saídas Decisão a tomar Conector Subrotina Programming Editor-exemplo blue red Program for Washing Machine Model main:high 0 label_6: label_D: high 7 start low 4 pin0=1 N Check door switch Green LED off Lock solenoid low 4 ifDopin0=1 then 0 let b0=label_19 motor sequence goto label_D let pins = 96 pause 3000 Y high 4 pin0=0 Green LED on Y Door open again! N pin6=1 N pin7=1 N Y Test red & blue switches let pins = 32 label_19: high 4 pause 2000 low 7 label_20: if pin0=0 then label_6 if pin6=1 then label_4D pins = 160 high 6 if pin7=1 let then label_44 goto label_20 pause 3000 pause 2000 low 6 let b0=b0+ 1 Y gosub blue gosub red label_44: gosub blue goto label_6b0> 10 low 0 Unlock door Y label_4D: gosub red let pins = 16 return goto label_6 return N Programming Editor-exemplo start gosub ler_cor let b0=pins& 224 000 001 b0= 0 N Y 010 b0= 32 011 b0= 64 N Y gosub avancar gosub esquerda Y forward halt Y gosub esquerda gosub direita esquerda direita alarme left right sound 0,(50,50) pwmout 1,10,40 pwmout 1,10,40 pause 1000 pwmout 1,10,40 pwmout 1,10,40 101 b0= 128 N Y gosub avancar parar avancar 100 b0= 96 N N 110 b0= 160 Y pwmout 2,10,40 pwmout 2,10,40 pwmout 2,10,40 return b1> 20 b1< 70 return gosub alarme As coisas complicam-se gosub parar readadc 0,b1 return return Y gosub esquerda ler_cor Y return b0= 224 N Y gosub avancar N b1> 132 N b1< 150 Y pwmout 2,10,40 111 b0= 192 N return N Y Y N N BASIC Instruções BASIC essenciais Controlo de pinos de Saída – – – – high 1 low 2 pins=%00000110 high portc 1 Leitura de pinos de entrada – b0=pins – if pin0=1… BASIC Saídas PWM – Instrução pwmout – Sintaxe: PWMOUT pino, período, dutycycle Pino é uma variável/constante que especifica o pino E/S a usar (1 ou 2). Período é uma variável/constante (0-255) que estabelece o período do sinal de PWM. Duty cycle é uma variável/constante (valor de 10 bits, logo, de 0-1024) que define o ciclo de trabalho (tempo em que o sinal está alto em cada período). BASIC Esta instrução difere de todas as outras pelo facto de ser executada continuamente (independente do resto do programa) até que outra instrução pwmout seja enviada. Para parar o sinal pwmout, basta enviar uma instrução pwmout com o período 0. Período PWM = (período + 1) x 4 x (1/4000000) = (período + 1) us Ciclo Trabalho = (dutycyle) x (1/4000000) = (dutycycle)/4 us BASIC Exemplo: Controlo de um motor Programa Inicio: high 7 low 6 pwmout 1,100,300 end BASIC start Salto incondicional – goto label Controlo de fluxo – If condição then label pin0=1 Aqui N Y Ali BASIC inicio: if pin6 = 0 then direita goto esquerda ‘************************** esquerda: low 7 low 6 high 5 low 4 pwmout 1,10,25 pwmout 2,10,25 goto inicio ‘*************************** direita: high 7 low 6 low 5 low 4 pwmout 1,10,25 pwmout 2,10,25 goto inicio ‘***************************** BASIC if … then if … and … then if … or … then Sintaxe: IF variável ?? valor (AND/OR variável ?? valor ...) THEN endereço Variável (s) é comparada com o valor(s). Valor é uma variável/constante. Endereço é uma label (etiqueta) que especifica o endereço para onde saltar se a condição se verificar (for verdadeira). BASIC ?? pode ser qualquer uma das seguintes condições = igual a <> não igual a (diferente) != não igual a (diferente) > maior que >= maior que ou igual a < menor que <= menor que ou igual a BASIC Seguimento de pista – Com 1 sensor – Com 2 sensores – Com 3 sensores – Com 3 sensores e flags Esquema de ligações Sensor de obstáculos (2outputs) Sensor de cor Alimentação dos sensores Bezouro Led Sensor de pista (3inputs) 9V Ligação ao cabo série para programar 9,6V M2 M1 BASIC Subrotinas Os procedimentos ou subrotinas, são largamente utilizados na programação para reduzir o tamanho dos programas, usando secções de código que se repetem num único procedimento. A passagem de valores para o procedimento, por variáveis, permite repetir a mesma secção de código a partir de várias localizações do programa. BASIC GOSUB endereço Endereço é uma label (etiqueta) que especifica o endereço. Função: Salta para a subrotina (procedimento) localizado no endereço, regressando quando encontra a instrução return. São permitidas até 16 GOSUBs (ou 256 no Picaxe 28X), podendo ser aninhadas até 4 níveis. Return BASIC GOSUB endereço Return Informação: A instrução gosub (ir para um procedimento), é um salto temporário para uma secção separada do código, de onde regressará, através da instrução return. Cada instrução gosub, deve ter uma instrução return correspondente. Não deve confundir esta instrução com a instrução goto, que é um salto incondicional para uma nova localização no programa. BASIC Esquerda Direita return return start pin0=1 Y N gosub Esquerda gosub Direita Vantagens face ao “spagheti” dos gotos. Programa: If pin0=1 then… BASIC Ciclos repetidos for … next Sintaxe: FOR variável = inicio TO fim {STEP {-} incremento} NEXT {variável} Variável vai ser usada como um contador Início é o valor inicial da variável Fim é o valor final da variável Incremento é um valor opcional que se sobrepõe ao valor de incremento normal do contador (+1). Se o incremento for precedido de um ‘-‘, será considerado que Fim é menor que Inicio e, portanto, o valor de incremento é subtraído cada vez que o ciclo se realiza. BASIC Informação: Os ciclos for… next são utilizados para repetir secções de código um certo número de vezes. Quando se usa uma variável byte, o ciclo repete-se até 255 vezes. Cada vez que a linha next é encontrada, o valor da variável ´eincrementado (ou decrementado) do valor definido por step (+1 por omissão). Quando o valor final é ultrapassado o ciclo pára e o fluxo do programa continua a partir da linha seguinte à instrução next. Os ciclos for…next podem ser encadeados até 8 níveis de profundidade. BASIC Exemplo: ciclo: for b0 = 1 to 20 high 1 pause 500 low 1 pause 500 next b0 pause 2000 goto ciclo ‘ define um ciclo de 20 vezes ‘ liga a saída 1 ‘ espera 0,5 segundos ‘ desliga a saída 1 ‘ espera 0,5 segundos ‘ salta para o início, incrementando b0 de +1, ‘ até que b0 = 20 ‘ espera 2 segundos ‘ salto para o início BASIC Leituras de tensões analógicas Instrução readadc10 Sintaxe: READADC10 canal, variávelword Canal é uma variável/constante especificando um endereço (0-3) – pinos 2,3,4 e 5. Variávelword é uma variável word que recebe os dados lidos (0-1024). Função: Lê um canal ADC (conversão analógico-digital) de 10 bits de resolução para uma variável de dimensão word (0-1024). BASIC Exemplo: sensor de cor symbol leitura = w0 inicio: readadc10 0,leitura if leitura < 200 then alarme goto inicio alarme: sound 0,(50,50) sound 0,(100,50) sound 0,(120,50) pause 300 goto inicio BASIC Outras instruções: PAUSE milisegundos Milisegundos é uma variável/constante (0-65535) que especifica quantos milisegundos dura a pausa. SOUND pino, (nota, duração, nota, duração, …) Pino é uma variável/constante (0-7) que especifica o pino E/S a usar. Nota(s) são variáveis/constantes (0-255) que especificam o tipo e a frequência. Nota 0 é silêncio. Notas 1-127 são tons crescentes. Notas 128-255 são ruídos brancos crescentes. Duração(s) são variáveis/constantes (0-255) que especificam a duração múltiplos aproximados de 10ms).