Manual

do

Maker

.

com

Robô seguidor de linha com palitos de sorvete

Robô seguidor de linha com palitos de sorvete

Que tal fazer um robô seguidor de linha utilizando como parte mecânica apenas palito de sorvete, palitos de churrasco e cola? se gostou da ideia, garanto que com a leitura desse artigo você vai gostar mais ainda, pois tudo será feito com palitos de sorvete, com excessões como o eixo, que será feito com um palito de churrasco. É um projetinho pra você gastar 15 reais (considerando a data dessa publicação).

Se estiver pensando em um robô que desvia de obstáculos, leia esse outro artigo.

Robô seguidor de linha (links dos materiais)

Pra quem não sabe, um robô seguidor de linha utiliza-se de ao menos 2 sensores de infravermelhos com feedback. O bom mesmo seria utilizar esse módulo prontinho da AutoCore robótica, mas como eu não o tinha, utilizei um simples mesmo, O ruim disso é que envolveu solda, portanto, se for utilizar esse tipo de sensor, adicione ferro de solda, estanho e paciência nessa empreitada.

O projeto foi feito com Arduino Nano e a base expansora dos GPIO. Eu sempre recomendo pela praticidade, apesar de que nesse projeto foi inevitável a utilização de uma mini-protoboard porque eu não tinha esse módulo pronto (e daí esse monte de fios que não estariam lá).

Utilizei duas baterias li-ion que comprei há algum tempo e este suporte para as baterias, que é uma mão-na-roda. Se assim como eu, você for utilizar esse sensor sem circuito, tenha em mente a necessidade da mini-protoboard.

O servo motor do eixo vertical é o SG90; esse aqui.

É bastante comum esse projeto, quase todo mundo que se inicia em Arduino gosta de fazê-lo, mas mesmo quando escrevo a respeito de projetos comuns, gosto de fazer algo diferente, por menor que seja a diferença, para que valha a pena você seguir o meu artigo invés dos outros tantos sobre o mesmo tema. E aqui a diferença começa pelo custo total do projeto. Considerando que você já tem um Arduino e um motor DC ou (preferencialmente) um motor de passo desses mais simples, o restante se resume a 2 pacotes de palitosde sorvete e no máximo 4 palitos espeto de churrasco, o restante é wiring. Mas se desejar, ainda pode adicionar algum charme extra. Eu coloquei algo mais e vou dispondo conforme discorrer a respeito. Por fim, você precisará colar os palitos, claro. Eu usei Cascola, você deve pagar menos de 4 reais em um tubo dessa cola no Kalunga e deve encontrá-la em diversas papelarias, assim como os palitos de sorvete e os palitos de churrasco.

Se preferir (e recomendo fortemente) o motor de passo, pegue o módulo ULN2003 e o motor na AutoCore Robótica.

Ferramentas

Não dá pra escapar muito disso; eu tenho uma micro-retífica Dremel, pode ser qualquer marca, mas é a ferramenta ideal para trabalhar com artesanato. No pior dos casos, você pode usar uma furadeira de rotação controlada ou uma furadeira comum, mas o risco de se machucar é maior. Utilizei também uma canetinha escolar e um compasso. Tirei a ponta da canetinha e coloquei no compasso para marcar o circulo na prancha de palitos. Não mostrei a mão de obra no video, mas dispus de diversas fotos do processo para que você tenha noção do resultado que deve obter em cada fase. Além disso, estou explicando os detalhes no video. Aproveitando o embalo, pooooorrrr favooorrrinscreva-se no nosso canal DobitaobyteBrasil no Youtube, falta pouquinho pra chegar a mil inscritos e isso me motivaria muito mais a produzir conteúdos em video - coisa que hoje me enche de preguiça devido ao trabalho de edição. Mesmo que você só acompanhe os artigos, essa é mais uma forma de me incentivar, pois pra mim é um feedback da satisfação que meus artigos podem representar a você.

Porque um triciclo

Era pra ser um bípede, mas houve um problema técnico inesperado. O peso do eixo era muito grande e apesar de manter-se o equilíbrio da roda sobre a perna, o eixo pendia e com isso o robô pareceria no mínimo precisar de uma fisioterapia. Pra não exibir um projeto nessas condições, preferi simplificar ao máximo e, sendo um triciclo, economizei o trabalho de uma roda (já falei que tenho preguiça?).

Composição

O triciclo tem além das 3 rodas, uma polia que vai ao eixo e uma polia que vai ao motor. para interconectar as polias, utilizei um elástico comum. Aproveitando a enormidade de recursos sobressalentes do Arduino para esse projeto, poderia incluir luz de freio, seta e ré, tudo para adicionar uma beleza extra ao projeto, mas você não precisa implementá-los para já ter algo divertido.

Alimentação

Você pode alimentar o Arduino pela USB, utilizando para tal duas baterias li-ion em uma caixa para baterias desse tipo. A vantagem de utilizar essa alimentação é o fato de ser recarregável. Quanto ao cabo USB, basta comprar um cabo em qualquer loja ou em um camelô e cortar do tamanho que achar ideal. Internamente todos os cabos que cortei seguiam o padrão vermelho para positivo e preto para ground. Mas se precisar testar, tem duas formas, sendo que a primeira você só testa o ground:

  • Coloque um multímetro em modo de continuidade ao fio preto e à carcaça do conector USB. Havendo continuidade, está identificado o GND.
  • Coloque o cabo USB ao Arduino e na carcaça do conector faça a mesma coisa. Depois, antes de passar pelo diodo, faça o teste de continuidade no fio vermelho.

Acabamento

Eu fiz o acabamento de duas maneiras nas rodas e polias; após o corte com uma serra na micro-retífica (que pode ser substituido por um arco de serra), lixei toda a lateral para arredondar. Em apenas 1 das rodas eu fiz com uma lixadeira de bancada para artesanato, mas perceba que a diferença é ínfima. A roda da esquerda foi feita na lixadeira de bancada e a da direita, acabada na própria micro-retífica.

duas_rodas-acabamento-300x170.webp

Depois de concluído, passei cera de carnaúba para dar um pequeno tom fosco e uniformizar a madeira. Isso proteje contra umidade e dá uma beleza sutíl ao produto final, mas é totalmente dispensável; tanto que só fiz nas rodas e desisti de fazer no resto. Eu queria mesmo era passar betume líquido nas rodas, mas um amigo disse que tiraria a beleza do artesanato, pois perderia o destaque dos palitos de sorvete. Apliquei o betume náutico apenas em uma das polias para mostrar o resultado. Realmente, na madeira natural fica mais bacana. O betume náutico também proteje contra umidade e cupim, mas também é dispensável.

Os cortes podem ser feitos todos com uma faca de pão, mas tome cuidado para não se ferir, ainda mais que isso testará sua paciência. Tendo essa paciência,  o resultado será o mesmo. Algumas peças eu cortei com faca de pão para poder dizer se era viável ou não, de modo a possibilitar qualquer maker a reproduzir esse robô seguidor de linha.

Tamanho das rodas

Faça do tamanho que desejar. Eu aproveitei a área útil total da prancha de palitos. Para as rodas, fiz um sanduiche de 3 camadas de palitos. Para as polias, 3 partes de 2 duas camadas. As polias ficaram do tamanho aproximado a uma moeda de 1 real, mas podem ser maiores ou menores. Eu recomendo que seja desse tamanho para mais, de modo a  evitar um corte nos dedos durante a tarefa.

Em relação às polias, existe uma regra simples; a roda menor girando uma maior dá mais força e menor velocidade. A roda maior girando uma menor dá mais velocidade e menos força. Eu optei por força, quero contemplar o robô seguidor de linha cumprindo sua tarefa, então quis evitar o risco de decepcionar-me após tanto trabalho; se reparar, essa semana nem teve artigo porque fiquei só nisso.

Fases da construção do robô seguidor de linha

Basicamente, as rodas foram feitas colando camadas de palitos (3 camadas) e depois de secas as camadas, a roda foi traçada com um compasso e por fim, cortada.

Eixo e polia

Quando fiz o círculo com o compasso, aproveitei para marcar o centro da roda onde deveria fazer o furo para passar o eixo. O mesmo para as 3 partes da polia, que depois de cortadas, bastou fazer um "sanduiche", colocando a cola entre as partes. É uma boa ideia furar o centro de cada uma das partes da polia para facilitar o alinhamento, observando através dos furos. Mas ainda que aconteça um leve desalinhamento, o elástico suprirá essa deficiência graças à sua elasticidade (redundante, mas não consegui pensar em outra palavra no momento). Essa parte é toda desmontável para o caso de precisar trocar o elástico.

Que raios é aquela ponta na lateral da roda?

Eu deixei para mostrar uma coisa interessante; a ideia inicial era fazer um bípede (e ainda o farei). Estava inicialmente projetando esse robô seguidor de linha para ser um bípede, inclusive já tinha feito as pernas, mas o conjunto ficou um tanto pesado, por isso resolvi fazer o tricíclo para não voltar à estaca zero. Mas as rodas foram aproveitadas, então não quis desmanchar o que já estava feito, mas não há funcionalidade dessa "arma de biga".

Acabamento sendo feito na lixadeira de bancada

Essa lixadeira da quarta foto é uma ferramenta que comprei há vários anos pelo DealExtreme. Ela possui um conjunto de peças que a transformam em um torno, serra de bancada, furadeira vertical etc. Gosto de utilizar essa lixadeira pela praticidade e pela agilidade. Veja que utilizei o eixo da serra circular da micro-retífica para fixar a roda sobre um dos furos da base da lixadeira, assim tive a liberdade de simplesmente girar a roda para que a lixadeira de bancada tirasse as imperfeições do círculo. Mas não se preocupe, mesmo que a roda ficar na mesma qualidade da roda do carro dos Flintstones, funcionará bem.

Fixação da longarina (quinta foto)

Foi realmente necessário furar os palitos da longarina para fazer um bom enquadramento, de modo a não deixar essa parte se movendo lateralmente sobre o eixo. Isso porque o motor foi fixado sobre ela, como você pode ver em detalhes no video.

Fixação da polia sobre o motor de passo (foto 7 e 8)

O  eixo desse motor de passo tem 5mm, então fiz o furo do mesmo diâmetro e dei uma leve desbastada para um encaixe justo. Se você utilizar um motor igual a esse, perceba que ele é chanfrado de dois lados. Após encaixar a polia, joguei um pouco de cola e finquei a ponta de dois palitos de churrasco nesses chanfros e os quebrei lá dentro. Então peguei o palito de churrasco e forcei sua entrada no centro do eixo para forçar a dilatação sobre as paredes do furo. Não ficou exatamente no centro, mas o furo na longarina onde esse eixo fica encaixado comporta essa variação quase imperceptível.

Fixação do motor (foto 9 e 10)

Dava pra ter feito algo um pouco melhor, mas como eu queria terminar rapidamente esse robô seguidor de linha, simplesmente colei um conjunto de palitos na parte de trás (oposta ao eixo do motor) e preenchi a pequena folga com cola quente. Enquanto a cola do conjunto de palitos secava sobre a longarina, coloquei um palito de sorvete chanfrado para criar pressão entre o motor e os palitos. Não é necessário exercer muita força nesse encaixe, apenas deixar justo.

Últimos detalhes

O elástico precisa ficar esticado um pouco além de seu comprimento. Se esticar de menos, o elástico patinará. Se esticar demais, uma força maior será exercida entre as polias e eventualmente consumirá mais recursos e/ou travará o robô seguidor de linha. Considere também que se muito esticado, o eixo começara em algum momento a ceder, afinal é só um palito de churrasco. Não haverá realmente um esforço, o pico é tirar da inércia,  os eixos estão rodando livremente.

O motor não deve ser preso diretamente ao eixo traseiro, porque no torque ele giraria, perdendo a estabilidade ou até mesmo não deslocando o robô seguidor de linha. Repare no video qual foi a solução.

Para movimentar o eixo vertical dianteiro, utilizei um servo motor SG90, o mais comum encontrado. A melhor opção de Arduino para esse projeto acredito que seja o Arduino Nano 5V devido ao espaço, mas utilize o que desejar. Como estamos utilizando apenas 1 servo motor e ele não fará mais do que deslocar o eixo para os lados esporadicamente, não será necessário uma alimentação externa.

O melhor posicionamento para o Arduino e caixa de baterias é sobre a longarina que interliga os eixos, de forma a equilibrar o peso, que se distribuirá entre os eixos traseiro e dianteiro. Assim não sobrecarrega o servo motor nem as polias.

Código

motor de passo

A primeira parte que fiz funcionar foi o motor, por duas razões; primeiro, o motor funciona de 5V à 12V, mas a questão principal é a corrente. Para não ter que fazer solda nem usar protoboard, liguei o motor diretamente ao Arduino. Ligar motores diretamente ao Arduino não é recomendado, mas eu já estou há uma semana trabalhando nesse artigo e não quero tomar mais tempo preparando alimentação externa. E pra piorar, coloquei o servo motor pra "mamar" do Arduino também. Mas enfim, comecei pelo motor para saber se o Arduino suportaria (já falei que não é recomendado alimentar o motor assim?) e também para ver se as polias estavam funcionando como desejado. Foi uma sensação interessante ver ele funcionando direitinho.

O código para o motor é o mesmo do artigo "motor de passo 5 fios com driver uln2003". Só troque "left" e "right" por "back" e "front". Como é o mesmo código, se quiser observar essa porção do programa, acesse o artigo no link do início desse parágrafo ou então olhe todo o conjunto mais adiante.

servo motor

O controle do servo motor é mais simples, a classe está pronta e é só instanciar e usar. Se você não teve um primeiro contato com servo motor ainda, sugiro artigo "controlando servo motor com Arduino". Também não vou repetir o código aqui, lá tem um exemplo e pode ser bom dar uma olhada para quando ver o código completo, saber o que é cada coisa. Mais propício ainda, o artigo "controle digital do servo motor com Arduino".

Um detalhe a observar é que eu só usei super-cola no eixo do servo motor, inicialmente. Não faça isso, escapou três vezes e certamente escaparia uma quarta. Devido a esse problema, fui obrigado a fazer a furação depois de já ter colado o suporte do servo motor e não foi nada fácil. Bastava ter feito o furo antes de prender o suporte do servo, mas a preguiça falou mais alto.  Outra questão relacionada ao servo motor é que o ângulo no eixo vertical  do robô seguidor de linha ficou muito alto, o que acaba sobrecarregando o suporte, fazendo uma alavanca. Como agora está parafusado, não deve ter mais problemas, mas o ideal seria ter reduzido o comprimento do eixo vertical em uns 3cm pelo menos.

sensores infravermelho

Os sensores foram presos na traseira, próximo às rodas. O funcionamento é basicamente uma leitura analógica do receptor. Tem módulos prontos como o citado no início do artigo, mas tem também outros modelos como esse que vou utilizar e também o desse artigo. Quando menor o valor de leitura, mais refletiva é a superfície. Portanto, se estiver utilizando o projeto em um piso branco, o gatilho passa a ser leituras altas, onde a linha deve ser (preferencialmente) preta. Se estiver utilizando em um piso escuro, o valor para o gatilho deverá ser a leitura de um valor baixo e nesse caso a linha deve ser branca. Utilizando dois sensores facilita muito as coisas, porque se o gatilho vier do sensor da esquerda, significa que o robô seguidor de linha deverá desviar-se para a esquerda. Do mesmo modo, se a interrupção vier do sensor da direita, o robô seguidor de linha deverá desviar-se para a direita. Não é necessário tirar média, calcular avanço, nada disso, simplesmente deixe o robô seguidor de linha se ajustar tantas vezes quanto necessário for.

A precisão dele pode ser melhorada se apontando diretamente para o chão, mas no caso ele está um pouco em ângulo devido ao aceleramento do processo pra finalizar esse artigo. Ainda assim, funciona.

Como não utilizei o módulo recomendado nesse link, tive que adicionar uma mini-protoboard ao projeto, pois o receptor e emissor infra-vermelhos necessitam de um resistor; 330ohms em uma das pernas do emissor e 20k em uma das pernas do receptor, totalizando 4 resistores. Tive também que fazer uma solda em todas as pernas dos receptores e emissores IR. Foi meio chato fazer isso, sugiro fortemente que use módulos prontos. Por causa dessa porcaria de IR que estou utilizando, tive que colocar a mini-protoboard, cola quente, solda e fios. O resultado não é nada bonito. Fora isso, foi um parto identificar as pernas do emissor e receptor, cada um foi montado de um jeito e pra uma direção diferente. Além disso, testei com resistor de 10K, 2K1 e finalmente 20K pra conseguir uma medição satisfatória. Na primeira conexão que fiz, subiu fumaça; por incrível que pareça, não queimou nada. O último problema que tive foi em relação ao ângulo do sensor. Coloquei ele muito inclinado e tive que fazer vários testes até descobrir que ele tem que ficar absolutamente perpendicular ao solo, a uma distância máxima de 5mm. Mais uma vez; use módulos prontos e evite essa dor de cabeça desnecessária.

No código completo você vê a implementação da lógica desse sensor, mas é fundamental que eu disponibilize o wiring dele, caso você faça a mesma besteira que eu em utilizar apenas os IR receptor e emissor.

Para testar os IR receptores, habilitei a serial para fazer print e simplesmente fiz uma leitura a cada 500ms:

#define LEFT  2
#define RIGHT 3
...
void setup(){
    Serial.begin(115200);
}
...
void loop(){
    ...
    int left_val = analogRead(LEFT);
    Serial.println(left_val);
    delay(500);
    ...
}

A partir daí vi qual era a range dentro da reflexão. Na implementação da lógica faço múltiplas leituras em um loop de curto intevalo e tiro a média para reduzir a taxa de erros, vale a pena dar uma conferida no código final.

código final

O código completo é esse, com uma lógica bastante simples e se atendo apenas em seguir o caminho:

#include <Servo.h>

#define SENSOR_RIGHT 2
#define SENSOR_LEFT  3
#define POS_MIN      69
#define POS_MAX      110
#define CENTER       89

Servo servo_direction; //instancia do servo

int servo_pos   = CENTER; //posicao central do servo
int back        = 0;  //para tras
int front       = 1;  // para frente
int stopIt      = 9;  //parar 
int toleranceR  = 0;  //valor de leitura inicial de RIGHT
int toleranceL  = 0;  //valor de leitura inicial de LEFT
int valR        = 0;
int valL        = 0;

//Variaveis de controle do motor de passo com ULN2003
int pins[4];
int estados[4][8];

//alimenta as variaveis com os valores iniciais dos sensores
void getInitialReading(){
    int i = 0;
    //pega 5 amostras, tira a media e pega 20% para ser a tolerancia
    for (i=0;i<5;i++){
        toleranceR += analogRead(SENSOR_RIGHT);
        delay(20);
    }
    //Uma boa pausa antes de comutar a porta do ADC
    delay(500);
    for (i=0;i<5;i++){
        toleranceL += analogRead(SENSOR_LEFT);
        delay(20);
    }
    toleranceR = (toleranceR/5)-((toleranceR/5)*0.12);
    toleranceL = (toleranceL/5)-((toleranceL/5)*0.12);
}

void readValL(){
    valL = 0;
    for (int i=0;i<5;i++){
        valL += analogRead(SENSOR_LEFT);
    }
    valL = valL/5;
}

void readValR(){
    valR = 0;
    for (int i=0;i<5;i++){
        valR += analogRead(SENSOR_RIGHT);
    }
    valR = valR/5;
}

void moveIt(){
  Steps(50,back);
  Steps(0,stopIt);
}

void goToLeft(){
    while ( valL < toleranceL){
        if (servo_pos > POS_MIN){
            servo_pos -= 5;
        }
        servo_direction.write(servo_pos);
        readValL();
        delay(10);
        moveIt();  
    }
}

void goToRight(){
    while (valR < toleranceR){
        if (servo_pos < POS_MAX){
            servo_pos += 5;
        }
        servo_direction.write(servo_pos);
        readValR();
        delay(10);
        moveIt();
    }
}

void getDirection(){
    readValL();
    readValR();
    
    if (valL < toleranceL && servo_pos > POS_MIN){
        goToLeft();
    }
    else if (valR < toleranceR && servo_pos < POS_MAX){
        goToRight();
    }
    else{
        int directionFor = servo_pos - CENTER;
        if (directionFor < 0){
            for (int j=servo_pos;j<CENTER+1;j++){
                servo_pos += 1;
                servo_direction.write(servo_pos);
                delay(20);
            }
        }
        else{
          for (int j=servo_pos;j>CENTER-1;j--){
                servo_pos -= 1;
                servo_direction.write(servo_pos);
                delay(20);
            }
        }
    }
}

void Steps(int steps, int directionFor)
{

if (directionFor == back){
    for (int j=0;j<steps;j++){
        for (int i=0; i<8;i++){
            delay(1);
            digitalWrite(pins[0],estados[0][i]);
            digitalWrite(pins[1],estados[1][i]);
            digitalWrite(pins[2],estados[2][i]);
            digitalWrite(pins[3],estados[3][i]);
        } 
    }
}
else if (directionFor == front){
    for (int j=0;j<steps;j++){
        for (int i=8; i>-1;i--){
            delay(1);
            digitalWrite(pins[0],estados[0][i]);
            digitalWrite(pins[1],estados[1][i]);
            digitalWrite(pins[2],estados[2][i]);
            digitalWrite(pins[3],estados[3][i]);
        }
    }
}
else{
    digitalWrite(pins[0],0);
    digitalWrite(pins[1],0);
    digitalWrite(pins[2],0);
    digitalWrite(pins[3],0);
}
}

void setup(){
    Serial.begin(115200);
    servo_direction.attach(7);
    servo_direction.write(servo_pos);

    delay(5000);
    getInitialReading();
    
    for (int i=8;i<12;i++){
        pinMode(i,OUTPUT);
        pins[i-8] = i;
    }
    //4 pins, 8 states
    //PIN 0
    int j = 0;
    estados[j][0] = 0;
    estados[j][1] = 0;
    estados[j][2] = 0;
    estados[j][3] = 0;
    estados[j][4] = 0;
    estados[j][5] = 1;
    estados[j][6] = 1;
    estados[j][7] = 1;

    //PIN1
    j = 1;
    estados[j][0] = 0;
    estados[j][1] = 0;
    estados[j][2] = 0;
    estados[j][3] = 1;
    estados[j][4] = 1;
    estados[j][5] = 1;
    estados[j][6] = 0;
    estados[j][7] = 0;

    //PIN2
    j = 2;
    estados[j][0] = 0;
    estados[j][1] = 1;
    estados[j][2] = 1;
    estados[j][3] = 1;
    estados[j][4] = 0;
    estados[j][5] = 0;
    estados[j][6] = 0;
    estados[j][7] = 0;

    //PIN3
    j = 3;
    estados[j][0] = 1;
    estados[j][1] = 1;
    estados[j][2] = 0;
    estados[j][3] = 0;
    estados[j][4] = 0;
    estados[j][5] = 0;
    estados[j][6] = 0;
    estados[j][7] = 1;
}

void loop()
{
    moveIt();
    getDirection();
}

No video você pode ver que está bem funcional e fiquei contente com os resultados, mas tive alguns problemas técnicos. Não se decepcione com o video; repare a funcionalidade. Os problemas foram os seguintes:

refletividade

Eu fiz o robô seguidor de linha seguir uma linha branca porque não tenho fita adesiva preta. Logo, precisei de um piso escuro. Tentei o piso da sala, mas a casa inteira tem piso de madeira, com excessão do banheiro e cozinha. O banheiro tem piso branco, então mesmo que quisesse filmar ao lado do vaso sanitário não seria possível. A cozinha tem porcelanato chumbo, pensei que seria o suficiente, mas é praticamente um espelho e não foi eficiente. Solução? Peguei um EVA preto (curto infelizmente) para o robô andar sobre ele. O outro problema  relacionado é que minha cozinha é estreito.

aderência

Infelizmente o EVA gera uma resistência maior que a força do elástico em alguns momentos, daí tive que dar um "cotó" no triciclo. Eu mostro esse detalhe no video e também mostro o robô andando sem o EVA. Em um piso frio eu não teria esse problema.

Observações finais

Se for reproduzir o projeto, tenha em mente as seguintes correções:

  • Reduza o eixo vertical de modo a diminuir o ângulo do triciclo.
  • Utilize módulos prontos para robô seguidor de linha e evite fios, solda, protoboard, cola e feiúra.
  • diminua as plataformas do servo motor, assim você reduz o peso sobre o suporte do servo motor.
  • Faça polias maiores e rodas um pouco menores se desejar mais velocidade no robô seguidor de linha.
  • Se possível, inverta a lógica de leitura para que o robô siga uma linha preta, assim quase qualquer piso serviria.

Como foi uma prova de conceito feita de primeira, estou bastante satisfeito com o resultado, por isso recomendo a brincadeira, mas tenha em mente que isso consome um tempo razoável, então faça uma peça por dia, sem pressa. Tem que ser uma brincadeira divertida!

Vídeo da prova de conceito.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.