LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: Asilva em 08 de Novembro de 2013, 15:20
-
Boas,
Estou a trabalhar com um arduino uno, um shield WaveShield (para audio) e um GPS.
Ao utilizar o WaveShield com a biblioteca WaveRP, funciona tudo bem, inclusive a parte de gravar audio. Ao utilizar o só o GPS, defino Portas serie (ss) nos pinos que o shield tem livres e tudo funciona bem.
Na utilização das duas coisas, tudo entra em parafuso, algumas vezes corria o setup() dentro do loop()?????, outras deixava de jogar audio, outras bloqueava, etc....
Isto deu-me muita dor de cabeça, e, depois de muita pesquisa, descobri e testei que o problema estava no facto de o (SoftwareSerial) na sua execução fazer uso de interupções que alteravam o normal funcionamento da biblioteca WaveRP.
Aquilo que eu peço, é uma sugestão vossa para a utilização do SoftwareSerial com o shield (com a biblioteca WaveShield) .(no fundo seria algo do genero de disabel da SS enquanto utiliza audio, ou outra sugestão onde coabitem todos.)
nota: para aquilo que pretendo preciso de 2 portas serie, uma para o GPS e outra para um sensor de distancia, e o meu arduino é o uno.
-
Se não usares o GPS ao mesmo tempo do sensor, podes utilizar um multiplexer externo e usar só a porta série de HW..
-
obrigado pela tua sugestão JM-ARAUJO, para ser sincero ainda não tinha ouvido falar nisso, vou pesquisar, mas á primeira vista parece-me que sugeres que ligue o rx do gps e do maxsonar ez1 juntos no tx do arduino(1), e que ligue o tx do gps e do maxsonar ez1 no rx do arduino (0).
esta não seria a solução ideal para mim, porque queria utilizar o maxsonar ez1 como uma bengala, que jogava um "bip" com um deley proporcional ao valor lido pelo sensor. Então, enquanto fazia a leitura do GPS para gravar um percurso, gostava de ter a opção da bengala.
se ouver outras soluções agradeço.
Já agora e como nunca utilizei as potas serial (0e1) com sensores, alguém me pode dizer como funciona: com o SoftwareSerial, eu estancio: #include <SoftwareSerial.h> SoftwareSerial ss(6, 7); e no Setup() ss.begin(38400); e depois utilizo ss.???();
como faço com as portas Serial??????,
-
Bem, penso que compreendo agora o que querias dizer, o que falas é algo deste genero? https://www.sparkfun.com/products/8970 (https://www.sparkfun.com/products/8970) .
tentei usar a serial do arduino com o GPS e ele dá-me erro ao compilar, posso estar a dizer uma asneira mas penso que a serial do arduino uno está dedicada á comunicação com o computador (USB).
verifiquei entretanto que o sensor de distancia alem da comunicação com serial port tambem tem uma saida analogica, por ai já estava safo.....
será que estou errado quanto á porta serial??????? poderei eu utilizá-la para o GPS e monitor sem sem o multiplexer externo???????? se não, qual o multiplexer que me aconcelham ???????? e não precisa de codigo ?????????
estou aberto a ideias e sugestões, não pensem que quero utilizar o forum para a papinha toda, eu pesquiso até bastante, mas as minhas limitações de ingles limitam-me muito.
agradeço toda a colaboração que me derem.
-
será que estou errado quanto á porta serial??????? poderei eu utilizá-la para o GPS e monitor sem sem o multiplexer externo???????? se não, qual o multiplexer que me aconcelham ???????? e não precisa de codigo ?????????
Bem eu nunca usei esses shields especificamente, mas tu próprio é que disseste que o wave shield interfere com o softwareserial, por isso não parece ser mto boa idéia ir por esse caminho...
Quando ao multiplexer, uses seja qual for a idéia é sempre a mesma, tens de escrever algum código mas pouca coisa. Basicamente são apenas algumas linhas para configurar qual das portas queres usar, e estar semrpe a alternar entre uma e outra para fazer o efeito que tu querias (da bengala).
Mas se tambem dizes que o sensor tem uma saida analógica, eu iria antes por esse caminho... Simplificava tudo, tanto a nível de código como a nível de haardware!
-
A ideia do multiplexer é boa...
Em relação ao melhor multiplexer para essa aplicação, não faço a mínima ideia, mas um ic com 2 MUXs 2:1 com 1 bit de seleção serve para o que queres, pesquisa mais sobre isso
-
Obrigado pelo vosso feedback, na verdade como disse na apresentação surgiam coisas estranhas quando juntei a solução GPS e WaveShield, testei alterar pedaços de codigo tanto de uma como de outra livraria, inclusivé impor condições para que enquanto estivesse a tocar o ficheiro não fizesse mais nada, mas aconteciam coisa variadas e desajustadas ao pretendido por mim, como por ex: a meio do loop() entrar no setup(), quando pelo conhecimento que tenho o setup só é executado uma unica vez no inicio do programa.
Tinha uma suspeita que pudesse ser de conflito nas interrupções mas não sabia o que originava isso, inicialmente achei que o codigo do gps usava interupções, o do WaveShild também e as mesmas entravam em conflito, não descarto isso por enquanto, mas havia mais do que isso porque comentei o codigo do GPS e mesmo assim não funcionava bem.
Pesquisei bastante e foi aí que encontrei isto: http://forums.adafruit.com/viewtopic.php?f=31&t=34003&p=168248&hilit=waverp#p168248 (http://forums.adafruit.com/viewtopic.php?f=31&t=34003&p=168248&hilit=waverp#p168248) , dai comentei o codigo que defenia o SoftwareSerial e testei que as coisas já funcionavam.
O sensor de distancia já está resolvido adquirindo o sinal por uma porta analogica que ainda tenho disponivel, agora só preciso a Serial porta para o GPS, tentei ligar o GPS ao porto digital "0 e 1" e no setup defeni Serial.begin(38400); que é o baud rate do GPS, mas ao tentar compilar dá-me erro, qualquer coisa como que a porta COM? já está atribuida, pesquisei alguma coisa e acho que no UNO a serial port está dedicada á ligação USB entre o Arduino e o computador, espero estar errado e que tudo isto não passe de codigo mal feito de minha parte, é por isso que peço a quem me possa ajudar nisto que o faça.
desde já agradecido pela vossa atenção e por qualquer sugestão de vossa parte.
-
A porta está atribuida ao USB mas nada impede que uses com outros dispositivos. A ligação do ATMega ao Serial-USB é feita por resistências de 1k, o que lá ligares vai-se sobrepor.
Mux estava a pensar em algo simples e comum, tipo o 74HC4052, mas pelo caminho que estás a seguir já não precisas.
Outra ideia: Se usas o waveshield só para emitir um bip, podes desfazer-te dele. Podes usar um besouro ou então usar um timer (0 é usado pelo arduino, o 1 e 2 devem estar livres) para gerar a frequencias do bip e amplificar com um lm386 ou do género.
-
O WaveShild é fundamental no que estou a fazer, não só para emitir um "bee", mas também para jogar audio e inclusivé gravar audio, isto faz parte dum projecto já antigo que estive a desenvolver e durante muito tempo tive-o parado por diversas situações que foram acontecendo.
A ideia é gravar percursos para invisuais, e posteriormente os percursos servirem de guia para os mesmos invisuais, logo o audio é fundamental para este projecto. depois de o apresentar na escola (tenho de o acabar até ao fim deste ano) vou o apresentar aqui com todo detalhe.
Com as portas digital Serial (0 e1)utilizei assim o codigo:
//#include <SoftwareSerial.h>
#include <TinyGPS.h>
/* This sample code demonstrates the normal use of a TinyGPS object.
It requires the use of SoftwareSerial, and assumes that you have a
4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/
TinyGPS gps;
//SoftwareSerial ss(6, 7);
void setup()
{
Serial.begin(38400);
// ss.begin(38400);
Serial.print("Simple TinyGPS library v. "); Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();
}
void loop()
{
bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (Serial.available())
{
char c = Serial.read();
// Serial.write(c); // uncomment this line if you want to see the GPS data flowing
if (gps.encode(c)) // Did a new valid sentence come in?
newData = true;
}
}
if (newData)
{
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
Serial.print("LAT=");
Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
Serial.print(" LON=");
Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
Serial.print(" SAT=");
Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
Serial.print(" PREC=");
Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
}
gps.stats(&chars, &sentences, &failed);
Serial.print(" CHARS=");
Serial.print(chars);
Serial.print(" SENTENCES=");
Serial.print(sentences);
Serial.print(" CSUM ERR=");
Serial.println(failed);
if (chars == 0)
Serial.println("** No characters received from GPS: check wiring **");
}
Não compilou dando-me o seguinte erro:"avrdude: stk500_getsync(): not in sync: resp=0x2a", também já chegou a dar-me um erro a dizer que a COM5 (a que usa) já estava atribuida.
Pesquisei no GOOGLE sobre o erro e encontrei algumas referencias de que com o arduino UNO os portos Serial estão dedicados á comunicação com o computador(mas como o meu ingles é fraquinho não posso estar totalmente certo disso), e, até aconcelhavam a não utilizar as portas para ver se o erro se resolvia.
Quando tenho as portas (0 e 1) ligadas, o erro dá-me sempre, se utilizo o SoftwareSerial funciona bem e não dá erro.
Pelo codigo que postei (que é do tinyGPS simple teste ajustado por mim ás portas Serial), sabendo que o baud rate do meu gps é 38400, estou a utilizar mal as portas Serial?????
se sim, como devo fazer?????
-
Algo óbvio que pode ter passado e só me ocorreu a ler sobre erros getsync() na net: quando fazes upload do programa para o arduino não podes ter nada ligado no pino RX nem TX, senão pode-se sobrepor à programação e dar erro.
-
OK, e existe algem que tenha alguma ideia de algo que possa fazer para trabalhar com o GPS e o WaveShild simultaneamente..????????????
Agradecia qualquer sugestão,..... algumas vezes a solução vem das ideias mais inesperadas.
Fico agradecido pelo feedback.
-
Mandas o IDE do arduino para o lixo e fazes o código de raiz, garantidamente que funciona tudo junto e ainda sobram 2 timers, como é código miserável para arduino, toda a gente e a mãe deles precisam de interrupções e timers e não sei que mais...
E sim, não podes ter nada ligado ao Rx/Tx para programar, algumas coisas fazem tri-state aos pinos de serial e não interferem, mas dado que o tipico shield para arduino é desenhado meio á sorte, nunca pensam nessas coisas.
-
Obrigado senso, mas o que me sugeres é algo que vai além das minhas capacidades, esperava poder encontrar uma solução que me permitisse fazer uso do código existente, integrando-o no meu.
Concordo plenamente com o que tu dizes, mas as minhas limitações levam-me a tentar encontrar outras soluções, e, se tens alguma ideia de como me ajudar agradeço.
-
A biblioteca serial devia funcionar para o que queres, mas usar um timer, possivelmente o 1, e o wave shield vi agora que não faz nada externo, quem tem de tratar de tudo é o micro, assim sendo, a opção mais simples deve ser saltares para um arduino mega/ usar um atmega644p que tem 40 pinos, existe em DIP, e que tem duas portas serial, e é suportado pelo IDE do Arduino.
-
nenhuma solução mais barata????? é que já estourei muitas patacas nisto e mais 40 não me dava jeito nenhum......
agradeço ideias.
-
Dai ter referido um atmega644p, compras um por 4-5€ na Mouser, mais um cristal e uns condensadores, montas numa breadboard.
Isso é uma questão de código, tudo poderá ser resolvido sem gastares mais nada, vá quanto muito realmente teres de usar um multiplexer.
-
Obrigado senso pela dica, tenho estado atento ao topico, e se demorei a responder foi porque escapou-me que tinha mudado de pagina e julgava que não havia novas.
ainda me surge a duvida de como establecer contacto com o computador para compilar o codigo, mas a verdade é que ainda vou pesquisar sobre a tua ideia.
dado isto tudo, a verdade é que também estou a lutar contra o tempo, e tenho que alcançar resultados a curto prazo.
depois de pesquisar sobre isto direi qualquer coisa, mas desde já o meu muito obrigada.
-
as leituras que fiz iam no sentido de utilizar o UNO em um ISP que com o uso do software sanguino programa o chip atmega644p, e, posteriormente faz de interface entre o chip e o computador.
tambem li alguma coisa sobre a utilização do avrdude para programar o chip no caso de não o conseguir com o IDE do Arduino.
não sei se estou a ir bem orientado, mas estou a tentar trilhar caminho enquanto não tenho o material para experimentar.
ainda não vi informação sobre a correspondencia dos pinos do chip a as portas, por ex: quais são os pinos que correspondem ás portas serie ( tem 2 rx e 2 tx ? )
ainda não tive tempo para ver o datashet, ( vou ter algumas dificuldades por causa do meu ingles) mas o pouco que vi este trata de igual o 164 / 324 e 644. ( mas estou a falar um pouco á sorte.)
Alguém sabe de alguma imagem que mostre a correspondencia dos pinos todos do chip atmega644p com as portas (analogicas, digitais (dentro destas serial)). Se sim, postem-me o URL SFF.
-
Está tudo na datasheet, secção pinout ou algo assim parecido, tem imagens do chip e descrição de cada pino, e sim, tens duas portas serial.
-
foram umas duas horas a dar uma vista de olhos no datasheet para ter uma ideia das coisa, e ontem já tinha dado uma vista de olhos nestes foruns: http://lusorobotica.com/index.php?topic=5640.0 (http://lusorobotica.com/index.php?topic=5640.0) , http://lusorobotica.com/index.php?topic=4571.45 (http://lusorobotica.com/index.php?topic=4571.45) , http://www.instructables.com/id/Turn-Your-Arduino-Into-an-ISP/?ALLSTEPS (http://www.instructables.com/id/Turn-Your-Arduino-Into-an-ISP/?ALLSTEPS) , http://reprap.org/wiki/Burning_the_Sanguino_Bootloader_using_Arduino_as_ISP. (http://reprap.org/wiki/Burning_the_Sanguino_Bootloader_using_Arduino_as_ISP.)
vou mandar vir o material e quando tiver alguns resultados, posto um forum novo ( pois penso que é ajustado, visto que o titulo está a ficar desajustado ao conteudo) e neste forum farei uma referência ao outro.
só gostaria de perguntar ao senso se entende se pelas referências que deixei aqui, estou a ir no caminho certo.
-
não tenho tempo para isto agora, e, na escola disponibilizaram-me um mega pelo tempo até á conclusão do projecto, no caso de poder ser util a alguém, deixo o URL desta imagem.
http://www.flickr.com/photos/stevemarple/6050076281/#in/photostream/ (http://www.flickr.com/photos/stevemarple/6050076281/#in/photostream/)
de futuro e com mais tempo penso vortar a isto.