Go Down

Topic: Divulgação - Tutorial de Arduino (Read 6103 times) previous topic - next topic

acollucci

Pessoal,

Estou montando um tutorial de Arduino, o qual pretendi fugi um pouquinho dos tutoriais que vejo na net. ( A maioria so ensinam a fazer blink :s)

Então dêem uma olhada e façam suas críticas por favor, se encontrarem algo errado no meu texto me apontem para que eu possa corrijir, eu irei utilizar esse tutorial para ensinar um grupo de estudantes do Segundo Grau numa feira de robótica, então seria muito bom se vocês pudesse criticar o tutorial.

Seguem os links

Parte 1 - http://amcollucci.com.br/2012/02/04/aprenda-a-programar-o-arduino-parte-i/
Parte 2 - http://amcollucci.com.br/2012/02/12/aprenda-a-programar-o-arduino-parte-2/
Parte 3 - http://amcollucci.com.br/2012/02/18/aprenda-a-programar-o-arduino-parte-3/

Ainda pretendo colocar mais umas 4 ou 5 partes.

bubulindo

#1
Feb 23, 2012, 12:10 pm Last Edit: Feb 23, 2012, 12:21 pm by bubulindo Reason: 1
A primeira parte do tutorial não é nada que não se encontre na net... logo fugiste um pouco ao que pretendias. :\

A segunda parte tem um erro "colossal".

Quote
Quando estava montando um braço mecânico na faculdade precisei de usar algumas estruturas que não tivessem loop, me deparei com a pergunta como faço para não executar o loop do Arduino sendo que ele trata essa função como se fosse a main() do C (dummies abaixo eu explico melhor ok  )
No Arduino o programa começa a ser executado pela função Setup(). Depois de concluído ele procura a função loop() e inicia sua execução, o que eu fiz e vou mostrar nesse post e como interromper o fluxo e apontar uma função que você criou para ser executada. É extremamente simples, pode até parecer boçal… Mas eu passei algumas boas horas para ter a epifania.

Portanto o objectivo é não correr o loop, correcto?

Depois colocas este código:

Code: [Select]
void setup(){
Serial.begin(9600);
naoqueroloop();
}
void loop(){
}
void naoqueroloop(){
Serial.print("Estou fora do loop");
}


Como uma solução para não correr o loop(). Isto está errado... Este código deixa o loop a correr infinitamente, mas apenas não faz nada. Logo, não é uma explicação muito coerente ou correcta e é até bastante óbvio que se não queremos que algo seja feito repetidamente, não colocamos isso num loop(). Mais uma vez o tutorial fugiu ao objectivo de ser diferente dos outros todos.

Seria muito melhor se mostrasses o que realmente é o loop() e setup() postando isto:

Code: [Select]
#include <WProgram.h>

int main(void)
{
init();

setup();
   
for (;;)
loop();
       
return 0;
}


Onde init() são as inicializações do Arduino para AD, pinos, clocks, etc...
Uma nota, se não quiseres realmente correr o loop, podes usar a função exit(0), mas não adianta de muito, uma vez que o ciclo for volta a chamar a loop.

A terceira parte é interessante... no entanto, se realmente queres sair do usual no que toca a tutoriais do Arduino, devias colocar online uma dissecação dos ficheiro que compõem o Arduino.
Explicar o setting dos ADs... o setting do timer e como se obtém o millis() e micros()... mostrar a lógica que transforma pinos em PORTD1 ou PORTC3... ou ainda mais importante, mostrar porque é que o Serial bloqueia o programa (o serial da versão anterior) e como é que isso é ultrapassado com interrupts.

Isso sim seria algo nunca visto no que toca ao Arduino e teria imenso interesse para quem já sabe piscar leds, mas quer entender o que está por baixo.

Não desmotives e continua! Espero que sigas algum dos meus conselhos.
This... is a hobby.

acollucci

Bubulindo,

Primeiramente Obrigado pelas considerações, não sei porque mas tive a intuição que seria um dos poucos que comentaria.

Abaixo segue a respostas aos seus comentários.

   1º Parte

Na primeira parte eu sabia que incorreria em repetição. Mas obrigado por reforçar.

    2º Parte

Sim está errado mesmo vou corrigir. Na época que fiz esse código não tinha atentado a esse fato. Vou corrigir e publicar, obrigado pelo toque.

     3º Parte

Bom, nessa parte eu quis demonstrar como funcionam os "comandos" do Arduino que quando não são funções são métodos dela.

Anotei suas sugestoes e vou inclusive usa-las ja na proxima parte obrigado pela colaboração.


bubulindo

Não leves a mal... mas se o objectivo é fugir aos tutoriais que existem pela net, o ideal é mesmo mostrar aquilo que mais nenhum mostra.
Em vez de fazer uso do que está construído de raíz, mostrar como é que isso é feito e quais as coisas que devem ser tidas em consideração quando se usam algumas funções é muito mais valioso. Até porque é algo que não existe actualmente.

Não estou a dizer que isto não tem valor, mas isto deve apenas ser um início para mostrar o que está escondido da maior parte das pessoas. E porque não, acompanhar a explicação dessas funções com a explicação de como os periféricos (AD, timers, etc) funcionam e como alterar essas definições. :)
This... is a hobby.

acollucci

Quote
Não leves a mal... mas se o objectivo é fugir aos tutoriais que existem pela net, o ideal é mesmo mostrar aquilo que mais nenhum mostra.


O objetivo e esse mesmo por isso que sua critica e muito importante.

Quote
mas isto deve apenas ser um início para mostrar o que está escondido da maior parte das pessoas.


Se o que você diz é sobre como a programação interna da IDE do Arduino, e sobre como alterar ela para implementar uma caracteristica ao seu projeto isso ja faz parte do meu escopo. Principalmente na parte de servomotores que acho a biblioteca muito limitada e vou precisar dela com os alunos..

Quote
E porque não, acompanhar a explicação dessas funções com a explicação de como os periféricos (AD, timers, etc) funcionam e como alterar essas definições.


Nisso eu não tinha pensado, agora que falou pensei se seria interessante inclusive fazer um experimento com um clock ligado a uma interrupção pra simular o efeito de millis... Mas vou pensar nisso e na complexidade visto que vou apresentar para alunos de 15-17 anos. Que em sua maioria não tem educação em programação/arquitetura de computadores  e nem em eletronica analogica/digital.

Amanhã vou postar as alterações no tutorial para corrigir aquele problema que você me falou. Na segunda parte, se eu puder contar com você para dar uma olhada e dar sua opinião.

att,
Anthony Collucci

bubulindo

Sim, claro que não me importo de rever o artigo. Nota que vou ter uma semana muito ocupada, logo vai ser difícil conseguir tempinho para me esticar nos comentários.

Claro que tudo depende para quem pretendes demonstrar o que se passa no Arduino... Mas acho que a maior parte das pessoas que andam pelos fóruns (inglês, principalmente) têm problemas exactamente por não perceberem como funcionam os periféricos do Arduino.

Imagina, por exemplo, que eu não preciso do millis? Tenho ali um timer (ou seja, 33% dos timers) ocupado a fazer algo que eu não sei o que é. Ou os ADs, existem modos de reducão de ruído... existem modos de funcionamento com interrupcão e com ligacão a um timer para adquirir a uma frequência certa. No entanto, isto (que a meu ver é extremamente importante para muitas das aplicacões), nunca é tomado em conta. Vai um analogRead() e pronto...
O mesmo com a Serial... imensa gente apareceu aqui a perguntar porque é que a aplicacão não funcionava correctamente... sem perceberem que era porque a comunicacão série bloqueava. E agora, com a introducão da serial usando interrupcões, vê-se problemas parecidos com as pessoas a não compreenderem que se desactivarem as interrupcões, a Serial deixa de funcionar.

Já que vais ver as bibliotecas, aproveita para ver a do Stepper Motor. Na thread da CNC, reparei que não existe uma classe para controlar um motor de passo com um driver externo dos bons (apenas com sinal de step e direccão). E se fizeres isso... aproveita para fazer um não bloqueante que use os timers para gerar os passos. :)
This... is a hobby.

acollucci

Olá

Consertei o tutorial 2, onde o Bubulindo havia encontrado o erro (Erro feio ainda por cima). link http://amcollucci.com.br/2012/02/12/aprenda-a-programar-o-arduino-parte-2/

Baseado nesse erro e na forma que foi apontado para mim montei o tutorial 4: link http://amcollucci.com.br/2012/02/25/aprenda-a-programar-o-arduino-parte-4/

Essa parte 4 e bem curtinha pois minha idéia era trabalhar com cartoes mmc e sd nessa parte, mas resolvi adiar para mostrar o porque meu codigo estava errado, e o que pode ser feito para implementar um end() no arduino.

att,

bubulindo

Achei interessante a funcão end(). Eu usei a funcão exit(0) dentro da loop e compilou. A modos que faria mais ou menos o mesmo.

Já que estamos a falar de algo relacionado, tenho utilizado uma plataforma chamada Maple (leaflabs.com) e eles têm um tutorial excelente, sobre como usar a sua IDE normalmente (como se faz no Arduino) e outro tutorial a explicar como fazer um bypass à IDE e escrever código à maneira antiga. Isto é interessante, porque abre um pouco mais a estrutura das ferramentas do Arduino e a ligacão entre funcões e o sítio onde estão guardadas, permitindo fazer algumas alteracões, ou adicionar código.

Seria interessante, levares essa 4a parte do tutorial ainda mais nesse sentido... e de preferência desmistificar um pouco a Makefile. :)

Bom trabalho.
This... is a hobby.

acollucci

Bubulindo,

Tive problemas com a exit(0), e a comunicação serial e motores de passo.
Terminei que resolvi isso quando criei a end(), e a mesma solução funcionou para a exit(0), o que não consegui compreender ainda e que estou tendando e que a solução que eu utilizei usa o delay, que em teoria para o processamento do Arduino, mas o que me parece que somente pára, após o termino da comunicação serial, mas estou a averiguar isso.

Quanto ao Mapple vou dar uma olhada e depois tento colocar alguma coisa a respeito, estou pensando agora em falar um pouco de interface, armazenamento SD e talvez programar um pouco em baixo nivel para mostrar como funciona no arduino.

Mas valeu pelo feedback!

bubulindo

O exit(0) é uma solucão drástica. Termina por completo o programa, daí não teres comunicacões ou nada que se pareca. Se fizeres um programinha de C para o computador e usares a funcão exit() vais ver que o programa termina. Isso é o que acontece no Arduino também.
Podes ver aqui:

http://www.cplusplus.com/reference/clibrary/cstdlib/exit/

Diz: "Terminate calling process

Terminates the process normally, performing the regular cleanup for terminating processes."

Ou seja, no Arduino, o único processo a correr é o programa principal e por isso desliga completamente. São conceitos diferentes e o exit na realidade não faz muito sentido em microcontroladores, mas creio que o AVR-GCC segue as normas POSIX (ou algo assim) e como tal tem esta e outras funcões incluídas.

Se quiseres levar as coisas para o baixo nível no Arduino, algo que é extremamente interessante é ensinar como usar os pinos de entrada e saída sem as funcões digitalWrite(), digitalMode(), etc, etc... Isto porque essas funcões são muito lentas e por outro lado são o assunto ideal para trazer à baila manipulacão de bits em C. Explicar as macros SetBit, etc, etc...

This... is a hobby.

Go Up