Programação Embarcada


Tarefa em grupo

Tarefa individual

Objetivos de aprendizagem:

Você:

Fluxo de trabalho da semana

Diagrama do fluxo de trabalho da semana 8


Ferramentas usadas


Software usado


Tarefa em grupo

Veja a página da tarefa em grupo

Introdução

Lendo o datasheet

Algumas impressões:

Falando sério agora, acho mesmo que esta tarefa é uma das mais difíceis. Estou travado por causa deste datasheet.

Vou pular para a programação e usar o datasheet só para consulta. Enquanto isso, vou destacar abaixo as seções importantes:

Configurações dos pinos do ATTINY44A Configurações dos pinos do ATTINY44A


Programação

Como eu estava meio confuso sobre como fazer, resolvi listar todos os passos em detalhe e ter uma espécie de modelo para os meus próximos projetos. Onde se aplica, preencho as lacunas depois de cada passo e vou fazendo enquanto documento, e é isso que vem abaixo:

  1. Gravar o bootloader
    1. Identificar o programador

      - avrdude ou Atmel Studio 7 (só Windows)

    2. Identificar o bootloader e o makefile

      - Para isso, começo deixando claro que quero programar um ATTINY44A

      - Baixe o makefile

      - O bootloader não vai ser usado aqui, porque não tem USB

    3. Baixar o bootloader

      - Não se aplica

    4. Identificar os comandos para gravar o bootloader

      - Nada

    5. Gravar o bootloader

      - Nada


  2. Gravar o firmware
    1. Identificar um código de exemplo:

      - Tem este código do Prof. Neil

    2. Identificar os comandos para compilar e gravar o firmware

      - Com todos os arquivos baixados antes numa mesma pasta, no Linux renomeio o arquivo para makefile e rodo o script para criar o firmware (vou repetir este passo toda vez que quiser mudar o código):

      mv hello.ftdi.44.echo.c.make makefile
      make

      Renomeando para makefile e compilando Renomeando para makefile e compilando

    3. Compilar o código-fonte

      - Feito no passo anterior

    4. Adaptar o makefile para funcionar com o meu programador

      Editando o makefile para funcionar com o programador Tive que editar o makefile para funcionar com o meu programador. Fiz isso trocando a entrada usbtiny por USBasp 2 vezes, uma para gravar o firmware e outra para gravar os fuses

    5. Gravar o firmware

      Rode:

      make program-usbasp

      Gravando o firmware Gravando o firmware

    6. Identificar quais fuses gravar

      - Isso já estava feito no makefile

    7. Gravar os fuses

      Rode:

      make program-usbasp-fuses

      Gravando os fuses Gravando os fuses


Programando com a Arduino IDE

Resolvi testar também a Arduino IDE para programar a minha placa.

Para isso, tem alguns passos que devem funcionar em qualquer sistema operacional

  1. Adicione uma placa nova no Boards Manager:

    Cole o seguinte em (Preferences)-(Additional Boards Manager URLs:)

    https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

    Adicionando a placa na Arduino IDE

  2. Escolha a placa que você acabou de adicionar, no meu caso ATtiny44

    Escolhendo a placa ATtiny44

  3. Escolha o processador, igual ao anterior

    Escolhendo o processador

  4. Selecione o clock. Como estou usando um oscilador externo de 20 MHz, escolhi "External 20 MHz"

    Selecionando o clock

  5. Como quero fazer um pouco de monitoramento serial nesta placa, escolhi a opção que corresponde ao meu FTDI, que é "/dev/cu.usbserial-A7032T9C"

    Selecionando a porta serial

  6. O último passo antes de compilar e gravar foi selecionar o programador, no meu caso "USBasp"

    Selecionando o programador


Primeiro teste

Gravando o código do Neil "hello.ftdi.44.echo.c"

Aqui, em vez de usar o terminal e o avrdude, usei a Arduino IDE, porque ela tem um monitor serial embutido.

Os resultados estão no vídeo


Programar outra coisa

Agora vou tentar programar a placa para piscar quando eu apertar o botão.

  1. Descobrir em qual pino o botão está ligado

    Esquemático da PCB

    Olhando o esquemático da PCB, descobri que o botão está ligado no pino 10

  2. Descobrir em qual pino o LED está ligado

    Olhando o esquemático da PCB, descobri que o LED está ligado no pino 6

  3. Código

    Em linguagem de gente, quero algo assim:

    1. Esperar o botão
    2. Se o botão for apertado, piscar o LED 3 vezes
    3. Se não, voltar para o começo

O problema é que eu nunca programei de verdade do zero, só alterei código, então vai ser um desafio...


1ª iteração

Como eu fiz

Primeiro tentei adaptar o código Blink da Arduino IDE com os meus números de pino. Não funcionou

O código sem comentários abaixo:

void setup() {

  pinMode(LED_BUILTIN, OUTPUT);
  
}

void loop() {

  digitalWrite(LED_BUILTIN, HIGH);   
  delay(1000);                       
  digitalWrite(LED_BUILTIN, LOW);    
  delay(1000); 
  
}

O primeiro código não funcionou porque eu estava usando um código feito para a plataforma Arduino, mas numa placa feita por mim. As placas Arduino normalmente têm um LED embutido ligado no pino 13, a minha placa não! A constante que a plataforma Arduino usa para o LED embutido é:

LED_BUILTIN 

No primeiro código tentei usar essa constante e não deu certo. No segundo código descobri, na tentativa, que colocar um número no lugar da constante fazia o LED acender.

O código certo para o ATtiny44 precisaria ter o pino declarado no começo com o seguinte código:

const int ledPin =  07;

Percebi isso na tentativa e erro. Agora entendo que o número do pino no datasheet não corresponde ao número do pino no Arduino, que também não é o mesmo da constante da plataforma Arduino. Claro, afinal esta é uma placa customizada, mas esse é o preço de ser noob!

Então, depois de achar na tentativa o número certo do pino, programei a placa e consegui fazer ela piscar!

Aqui está o código customizado sem comentários:

const int ledPin =  07;

void setup()    {

  pinMode(ledPin, OUTPUT);
  
}

void loop()     {

  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);

}
        

Chega de achar pino na tentativa. Aqui está o diagrama de pinagem do ATtiny44 no Arduino

Diagrama de pinagem do ATtiny44 no Arduino

Para a placa reconhecer o botão, também precisei inicializá-lo, com o seguinte código no começo do sketch:

const int buttonPin = "the pin number here"

Depois tive que declarar uma variável para guardar o estado do pino, com o seguinte código:

int buttonState = 0; 

O <0> no código acima também poderia ser escrito como <LOW>, outra constante da programação Arduino. Veja o site do Arduino sobre constantes.

Depois de pesquisar os pinos do ATtiny44 no Arduino, e com os números certos dos pinos em mãos, troquei os pinos no código e funcionou! Aqui está o código. (Corrigido depois: o arquivo original tinha if (buttonState, HIGH) e chaves no lugar errado, e não compilava.)

const int buttonPin = 3;
const int ledPin =  7;

int buttonState = 0; 

void setup() {

  pinMode(ledPin, OUTPUT);

  pinMode(buttonPin, INPUT);
}

void loop() {

  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH) {

  digitalWrite(ledPin, HIGH);
  } else {

    digitalWrite(ledPin, LOW);
  }
}
    
Esquema

Como perdi esta placa há muitos anos, só posso mostrar como ligar o programador numa placa parecida, igual fiz na semana de Projeto Eletrônico.

Programadores FabISP e USBasp

Aqui mostro como usei os programadores em Dispositivos de Saída. Para outro método sem a Arduino IDE, veja Programação Embarcada

Programador USBaspUSBasp

Programando uma placa com ATtiny44 pela Arduino IDE usando um FabTinyISP ou USBtinyISP que eu fiz.

Programador FabISPFabISP

Para mudar o comportamento do botão, simplesmente troquei a constante <HIGH> pela constante <LOW> aqui:

if (buttonState == LOW) {

Assim a lógica do código fica invertida, ou seja, quando o botão está solto o LED fica apagado.

Agora inverti quando o LED acende e apaga. Aqui está o código sem comentários:

const int buttonPin = 3;
const int ledPin =  7;

int buttonState = 0;

void setup() {

  pinMode(ledPin, OUTPUT);

  pinMode(buttonPin, INPUT);
}

void loop() {

  buttonState = digitalRead(buttonPin);

  if (buttonState == LOW) {

    digitalWrite(ledPin, HIGH);   
  }else {

    digitalWrite(ledPin, LOW);
    }
    }

Vamos ver a prova...


Piscar 3 vezes

Com um acréscimo simples no código, mudei o comportamento para ele piscar 3 vezes.

Código para piscar 3 vezesBaixe o código (Corrigido depois: o loop só ligava o LED três vezes, sem apagar, e ele nunca piscava; agora ele apaga e espera entre as piscadas. A imagem mostra o código original.)


Hackeando a placa

Eu estava meio incomodado porque a minha placa não me avisava quando estava ligada, então resolvi soldar um LED vermelho e um resistor de 22 Ohms, assim, se eu ligasse errado, eu saberia e inverteria as ligações. (Nota: a 5 V, 22 Ohms deixam passar uns 145 mA pelo LED, muito acima dos 20-30 mA que ele aguenta; o certo seria uns 150 Ohms.)

Aqui está o antes e depois

PCB antes da modificação Antes

PCB depois da modificação Depois

PCB depois da modificação, com o LED vermelho aceso Depois

← (18 mar) Usinagem Controlada por Computador · todas as semanas · Dispositivos de Entrada (01 abr) →