Rušení

Chcete si postavit robota, ale tak nějak nevíte kudy do toho?
Odpovědět
haas

Re: Rušení

Příspěvek od haas »

Tak dneska jsem zkoumal patice a vývody obvodů.Patice je v plošném spoji narvaná silou to přiznávám, protože při vrtání mi některá díra ujela bokem.Nicméně jsem všechny vývody narovnal a znovu zasunul, ale i tak to tam nemůžu normálně strčit, musím to opravdu ke konci rvát aby si to trochu sedlo do té patice.Taky jsem včera zkoušel 10x robota zapnout a vypnout a pak jsem pohýbal s intergákama a znovu to zapínal a vypínal.Po novém usazení obvodů bylo chování částečně odlišné a setrvávalo při téměř při všech 10ti zapnutích.Takže jsem si objednal nové patice, tentokrát v klasickém provedení, nyní mám precizní.Možná se problém vyřeší, ale patice budou až v pátek :-(

Pokud nepomůžou nové patice, tak vykuchám ten zdroj.

Na L293D piny 8 a 16 nejsou propojeny ani prohozeny.Napájení motorú jde samostatným kabelem na kolíkovou lištu hned vedle vstupního pinu H můstku(pin 8)

Dneska mi přišel nový LCD displej, tak jsem ho tam vrznul a nechal zobrazovat data, která přichází po I2C od ultrazvuku.Zobrazovali se mi jen znaky +++++.
Pak jsem do proměnné označenou c do které se ukládá přijaté data se sběrni natvrdo napsal číslo 5 a nechal ho zobrazit na displeji.Vysledkem byli dvě čárky ||
Na začátku jsem ještě zkoušel zobrazit nápis "hello world" dle ukázkového programu na stránkách arduina a vše bylo v poho.

Přikládám programy které jsem použil, možná dělám chybu také tam.Podotýkám, že jsou to pouze testovací programy, abych vyzkoušel, jsestli se vůbec něco bude dít.
Také posílám schéma zapojení, ale je ton vyfocené a malované od ruky.Některé věci nejsou z hlediska technické dokumentace zcela správné, ale nepočítal jsem s tím, že se nato kromě mé osoby bude někdo koukat :-) Kreramické kondezátory 100nF ještě nejsou ve schématu zakresleny, ale na desce už jsou.

Ta dioda se může dát i přímo na kabel mezi baterii a svorkovnici pro vstup do stabilizátoru, že?Zárověň by to slouží i jako ochrana proti přepolování.Na vstupu mám kondík LOW ESR 100uF 35V, ale nachystaný i 470uF, který jsem tam nakonec nedal.Vyzkouším i tuhle variantu.

Moc děkuju za rady, snad něco zabere.



SLAVE:
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 12, 10, 9, 8, 7);

void setup()
{
lcd.begin(16, 2);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
Wire.begin(5);
Wire.onReceive(receiveEvent);


}

void loop()
{
}

void receiveEvent(int howMany)
{


char c = Wire.read();
lcd.print(c);
if(c <10)
{
digitalWrite(3,LOW);
digitalWrite(4,HIGH);
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
}
else if(c >18)
{
digitalWrite(3,HIGH);
digitalWrite(4,LOW);
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
}
else if(c>10&&c<18)
{
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
}
}





MASTER:
#include <Wire.h>
const int pingPin = 7;


void setup()
{


Wire.begin();
}

void loop()
{
long duration, cm;

pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);


pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);
pinMode(pingPin, OUTPUT);

cm = microsecondsToCentimeters(duration);
Wire.beginTransmission(5);
Wire.write(cm);
Wire.endTransmission();

delay(600);
loop();
}

long microsecondsToCentimeters(long microseconds)
{
return microseconds / 29 / 2;
}




Na vzhled cestiček se moc nedívejte, maluju to lakem na auta od ruky a pak leptám v kyselině solné s peroxidem.
Přílohy
zdroj.jpg
pomocná deska.jpg
hlavní deska.jpg
Naposledy upravil(a) haas dne 07 led 2014, 21:11, celkem upraveno 2 x.
haas

Re: Rušení

Příspěvek od haas »

.
Přílohy
LCD.jpg
mcu2-pomocná deska.jpg
mcu 1 + L293D.jpg
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Rušení

Příspěvek od AlesH »

Ahoj. Při pohledu na program mám dojem, že pro výpis na LCD je nevhodně použit příkaz "print(c)". Nemám přímé zkušenosti s knihovnou "LiquidCrystal" pro Arduino, ale podle dokumentace se výše uvedeným způsobem program zřejmě pokouší na LCD vypsat ASCII reprezentaci hodnoty "c" ( viz. http://cs.wikipedia.org/wiki/ASCII ). Malá čísla jsou netisknutelná a teprve např. pro c=48 by se na LCD měl vypsat znak "0". Lepší by mělo být použití se dvěma parametry, např. "print(c,DEC)", což by teprve mělo pro c=48 vypsat očekávaný řetězec "48".

Ohledně rušení mne napadlo, že "zarušit" by se případně mohl i ten ultrazvukový dálkoměr takže osobně bych ho zkusil na chvíli fyzicky odpojit a udělat pár testů bez něj. Například by MASTER mohl posílat pevně definovanou testovací sekvenci čísel (příkazů pro motory, s rozumnými prodlevami).
Naposledy upravil(a) AlesH dne 08 led 2014, 08:24, celkem upraveno 1 x.
petr-kubac
Příspěvky: 96
Registrován: 24 úno 2013, 15:43
Bydliště: Frydek - Mistek
Kontaktovat uživatele:

Re: Rušení

Příspěvek od petr-kubac »

Při všech problémech alespoň pochvala od dědka - máte moc pěkně ručně malované plošné spoje.
"The best computer language is a solder" - "Nejlepší programovací jazyk je pájka" - Bob Pease
http://petr-kubac.blog.cz/
haas

Re: Rušení

Příspěvek od haas »

Děkuji za pochvalu, alespoň to mě potěšilo.
Ten problém se zobrazováním nesmyslných znaků byl způsoben chybějícím DEC v závorce.Díky.


Tak bohužel patice budou až v podělí :-( ale nabývám dojmu, že tím to asi uplně nebude.
Nyní jsem dal na vstup spínaného zdroje větší kondenzátor 470uF(LOW ESR) a také protiresetovací diodu 1n4007.Motorky nyní vždy napájím přímo z baterií přes pwm.
Dnes jsem zkoušel připojit přímo k hlavnímu mcu odrazové čidla pro snímání čáry.Jsou zapojeny tak, že z výstupu jde vždy log 0 nebo 1.Při tomto zapojení se robot choval normálně, tedy motory se zapínaly a vypínaly dle přechodu mezi černou a bílou.Jenže jsem si všiml, že na ultrazvukovém senzoru problikává nepravidelně dioda vždy když motory jedou nebo mění směr otáčení.Čím větší otáčky motory mají tím víc ultrazvuk šílí.Ale robot jako takový neblázní.
Nyní mám odrazový senzor zapojen na pomocném mcu, který má posílat log 1 nebo 0 dle odrazu po I2C.Hlavní mcu má přijmou data zobrazit na displeji "START" nebo "STOP" a spustit nebo zastavit motory.
Výsledek:pokud jsou motory odpojeny vše funguje, pokud je připojím, tak při zobrazení "START" se motory spustí, ale už zůstanou běžet a čidla už nereagují na změnu.
Takže dle mého názoru je problém v samotné I2C a také v zarušení ultrazvuku.

Nevíte jak ošetřit zběrnici buď mechanicky nebo programově a to samé i toho ultrazvuku?
jsem z toho už opravdu zoufalý, protože nemůžu najít chybu.

Zde jeukázka: http://www.youtube.com/watch?v=QTIUwXhH ... e=youtu.be
Nejprve jsem odpojil kabel od napájení motorů.
Zapnul robota.
Měnil jsem podklad mezi černou a bílou a na lcd je vidět že je vše ok.
Nyní jsem zapnul napájení motorů a byl po všem, nic už nereaguje.

Kabely od I2C jsou vidět 0:27 je to ten modrý a fialový.


Možná by mi mohl pomoci autor tohoto robota http://robodoupe.cz/2013/muj-robot-r2/
jedná se v podstatě o to samé.Nevíte kde vzít jeho email?

PROGRAMY:

//MASRET
#include <Wire.h>
int vnejsiL;
int vnitrniL;
int vnitrniP;
int vnejsiP;


void setup()
{ pinMode(8,INPUT);
pinMode(9,INPUT);
pinMode(10,INPUT);
pinMode(7,INPUT);
Wire.begin();

}


void loop()
{
delay(400);
vnejsiL=digitalRead(7);
vnitrniL=digitalRead(8);
vnitrniP=digitalRead(9);
vnejsiP=digitalRead(10);

if( vnitrniL==LOW&&vnitrniP==LOW) {
Wire.beginTransmission(5);
Wire.write(LOW);
Wire.endTransmission();

}

else {
Wire.beginTransmission(5);
Wire.write(HIGH);
Wire.endTransmission();
}
}




//SLAVE

#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 12, 10, 9, 8, 7);


void setup()
{
lcd.begin(16, 2);
Wire.begin(5);
Wire.onReceive(receiveEvent);

}

void loop()
{
}
void receiveEvent(int howMany)
{

delay(10);
char c = Wire.read();

if( c==LOW) {
lcd.clear();
lcd.print("START");
analogWrite(3,130);
digitalWrite(4,LOW);
analogWrite(5,130);
digitalWrite(6,LOW);
}
else {
lcd.clear();
lcd.print("STOP");
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
}
}
Naposledy upravil(a) haas dne 12 led 2014, 16:09, celkem upraveno 2 x.
haas

Re: Rušení

Příspěvek od haas »

Tady přidávám další video z ultrazvukem připojeným přímo k hlavnímu mcu, opět pokud motory stojí je vše ok, ale po jejich zapnutí můžete vidět šílené blikání črvené diody.
Ale v tomto režimu bez I2C robot je robot schopen už nějaké funkce alespoň částečně.jinak přes zběrnici to přestane fungovat úplně.

video: http://www.youtube.com/watch?v=1Vl1v-B- ... e=youtu.be
na začátku opět odpojuji motory
kyž je moje ruka blíž jak 10cm tak se zapnou motory a pokud je vzdálenost větší jak 10cm tak se zastaví.

Pro úplnost jsem dám i program


#include <Wire.h>
const int pingPin = 2;
#include <LiquidCrystal.h>
LiquidCrystal lcd(11, 12, 10, 9, 8, 7);


void setup()
{ lcd.begin(16, 2);
}



void loop()
{
long duration, cm;

pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);


pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);

cm = microsecondsToCentimeters(duration);

if(cm<10) {
lcd.clear();
lcd.print("START");
analogWrite(3,130);
digitalWrite(4,LOW);
analogWrite(5,130);
digitalWrite(6,LOW);
}

else {
lcd.clear();
lcd.print("STOP");
digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
}

delay(400);
loop();
}

long microsecondsToCentimeters(long microseconds)
{
return microseconds / 29 / 2;
}
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: Rušení

Příspěvek od jrt »

Zeptám se pro jistotu ještě jednou:
- zkontroloval jste napájení toho ultrazvuku? Nezapomněl jste připojit zemní vodič?
- jsou pull-up rezistory na i2c opravdu 4k7 a ne 47k, 470k...?

Odpojte od ultrazvuku i2c a nechte jen napájení. Šílí pořád?
jrt
haas

Re: Rušení

Příspěvek od haas »

Kontrolu kabelů napájení ultrazvuku jsem zkoušel, vše vypadá ok, zemní vodič?Myslíte přímo zemní vodič ultrazvuku, ten mám připojen, bez toho by to nešlo, myslím.
Ty pull up rezistory jsou 2k2 protože jsem jiné nenašel, ale v některých zapojení jsem viděl i 2k7, nicméně většinou tam bylo 4k7.Ten odpor přece nemůže mít tak zásadní vliv nebo ano?
To video s ultrazvukem je bez i2c a dělalo to problém.Jinak původní zapojení je z ultrazvuku na pin 7 prvního mcu a přes anlogový pin (i2c) data jdou do druhého mcu.
Stejné zapojení s ultrazvukem jako je na videu jsem zkoušel se samostatným napájením motorů a elektroniky a nebylo to lepší :-(

Zde se řeší podobný problém, zkoušel jsem po měření ihned přepnout výstup na vstup, ale zlepšení je nepatrné.Neměl bych sběrnici nějak odstínit?
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: Rušení

Příspěvek od jrt »

Ta hodnota 2k2 na i2c je v pořádku, dá se jít až na 1k.
Teď už mě napadá jen jediné řešení: Vezměte ohmmetr a propískejte spoj po spoji a na schématu si je pečlivě odškrtávejte. Někde bude buď něco nepropojeného, přerušený spoj nebo špatný kontakt v patici, konektoru nebo jumperu.
Zatím poslední nápad: máte resetovací piny opravdu správně připojeny na +5V? Je hodnota toho rezistoru opravdu 10 k (změřená, nikoli přečtená podle kódu)? Nemá resetovací tlačítko svod? Vezměte voltmetr a opravdu pečlivě všude změřte napětí.
jrt
haas

Re: Rušení

Příspěvek od haas »

Budu to muset všechno projít.Ten odpor je opravdu 10K.Co myslíte tím svodem?Jesti neprobíhá reset samovolně?
Mohlo by to dle Vašeho názoru být i špatným kontaktem mikrokontroléru a paticí ikdyž bez motorů to funguje?
Odpovědět