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 »

Dobrá vyzkouším.
Jen se zeptám.Kdybych to dělal znovu a bylo by to na způsob stavebnice jak navrhujete,nnevadily by tam všechny ty káblíky, kterými bych to musel propojit?Nevznikalo by tam ještě větší rušení než když je všecho sice na jedné desce, ale spojeno krátkými cestičkami?Nemáte foto nějakého robota, který takhle řešený?
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: Rušení

Příspěvek od jrt »

To rušení je nutno najít a odstranit, takže do propojovacích kablíků nemůže nic lézt :)
Projděte si web Lets Make Robots, kde najdete spousty inspirace nejen na roboty sestavené z modulů, ale i na roboty s řídícím systémem sestaveným jen na nepájivém poli.

Mimochodem, zkuste ty motorky připojit přímo na zdroj, zapnout vedle nich rádio a projet celou stupnici na všech pásmech. Podle toho hned uvidíte jak moc ty motory ruší.
Může se také stát, že jeden z nich (nebo oba) mají na komutátoru nebo ve vinutí svod, který způsobuje mžikové zkraty zdroje a tím zapřičiňuje občasné resety procesoru a mohutné rušení.
jrt
haas

Re: Rušení

Příspěvek od haas »

Zkusil jsem napájet krystal přímo na vývody a také kondenzátory( dal jsem nové 27pF)
Něchal jsem to běžet 3x 30 smyček a ok.Pak jsem si všiml, že drát od stínění(obalu motorů) není zapojen, tak jsem ho zapojil na gnd jednou u zdroje a jednou u mikroprocesoru a dřív nebo pozděj se zase resetoval.Možá to bude motorama jak píšete.Nemám tam ty originální, které se dovájí s tou převodovkou, ale mám tam jiné s nižším odběrem.
Díky za ten odkaz.
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: Rušení

Příspěvek od jrt »

haas píše:Pak jsem si všiml, že drát od stínění(obalu motorů) není zapojen, tak jsem ho zapojil na gnd jednou u zdroje a jednou u mikroprocesoru a dřív nebo pozděj se zase resetoval.
Stínění se zapojuje zásadně jen na jednom konci, jinak je nebezpečí vytvoření tzv. zemní smyčky, která rušení jen zhoršuje, protože vytvoří hezkou přijímací anténu. Nechte to stínění připojené na gnd jen u zdroje a zkuste to znovu.
jrt
haas

Re: Rušení

Příspěvek od haas »

No je to to samé.Pokud je stínění zapojené tak se resetuje, pokud není tak to zatím vždy jede.Ten kabel od stínění je vedený od zadní části do přední hned pod DPS to by taky mohlo mít vliv,ne?
Teď jsem dal krystal zpět na místo.První test jsem dělal jako před tím bez připojeného stínění a potom se stíněním opet se resetoval v obou případech.
Při dalším pokusu bez zapojeného stínění to fungovalo docela dlouho.Tak jsem opět zapojil stínění a začal se zase resetovat.
Mimochodem zkoušel jsem to s tím rádiem a na všech frekvencích jsem slyšel bzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz.Parádní muzika :-)

Nevím co teď??
Začnu asi znovu, jen se pořád nemůžu rozhodnout jaké řešení.Jestli to udělat jako moduly nebo jako kolega Navrátil.Trochu se obávám, že po spoustě času investovaného do nové desky to bude zase blbnout. :-(
haas

Re: Rušení

Příspěvek od haas »

Tak už zase píšu.Nechci to zase zakřiknout, ale dnes slavím první úspěch.Použil jsem jiný testovací program.Nyní s nejprve master vyšle žádost a sleve teprve provede měření a pošle data zpět a fungovalo to.Jen mi nejde do hlavy že přetím to fungovalo taky ale jen bez mototrů teď i s motory.To jsem dneska ani nezapojil odstínění.
Přikládám ukázku programu.
Mám ještě jednu otázku.Těch osm baterií mělo při zátěži(jednotlivě) napětí 1.2 až 1.1 V ale jedna z nich měla 0.5 V.To znamená, že je na odpis?Podle mě to na těch 0.5V spadne až po nějakém čase, kdy se baterie z úplného nabití trochu vybije a pak to jde už vždy rychle dolů.

//i2c Slave
#include <Wire.h>

int vnitrniL;
int vnitrniP;

void setup()
{pinMode(8,INPUT);
pinMode(9,INPUT);
Wire.begin(5);
Wire.onRequest(requestEvent);
}

void loop()
{
delay(100);
}

void requestEvent()
{
vnitrniL=digitalRead(8);
vnitrniP=digitalRead(9);

if( vnitrniL==LOW&&vnitrniP==LOW) {
Wire.write(0);
}
else {
Wire.write(1);
}
}




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

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

}

void loop()
{
delay(500);
Wire.requestFrom(5,1);

while(Wire.available())
{
char c = Wire.read();

lcd.clear();
lcd.print(c,DEC);
if( c==0) {
analogWrite(3,130);
digitalWrite(4,LOW);
analogWrite(5,130);
digitalWrite(6,LOW);
}
else {

digitalWrite(3,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
}
}
}
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: Rušení

Příspěvek od jrt »

Těch osm baterií mělo při zátěži(jednotlivě) napětí 1.2 až 1.1 V ale jedna z nich měla 0.5 V.To znamená, že je na odpis?Podle mě to na těch 0.5V spadne až po nějakém čase, kdy se baterie z úplného nabití trochu vybije a pak to jde už vždy rychle dolů.
Ten článek je na odpis a moje nervy už taky. Od začátku si tu povídáme o kvalitě napájecího zdroje, stále tvrdíte, že má i při zátěži 9,6V a teď najednou vyjde najevo, že tam nemohlo být víc, než nějakých 8,7 až 8,9 V.
No nic. Článek, který je vadný, nejen nedává napětí, ale má taky velký vnitřní odpor a tak při zátěži zdroje dochází k poklesu napájecího napětí, často i mžikově, takže tím by se vysvětlovaly ty resety a ostatní záhadné poruchy. A ano, článek je na odpis a možná, že i některé další.
Než začnete předělávat spoj, dejte si do pořádku všechny tyhle "drobné" nedostatky a myslím, že se vám robot rozjede bezchybně.
Petr Kubáč to vyjádřil moc hezky:http://petr-kubac.blog.cz/1207/robotika ... onektorech a já bych dodal, že samozřejmě taky o napájení.
jrt
haas

Re: Rušení

Příspěvek od haas »

To jsem psal o naměřeném napětí je pravda.Rozdíl napětí bez zátěže a se zátěží je asi 0.3V.Nehledě k tomu, že reset nastával jak na baterie tak na normální zdroj ze sítě.Nemůžu za to, že včera bylo celkové napětí přes 9 voltů a dne to zapnu a okamžitě to spadlo na 7V.Při úplném nabití je napětí nějakých 10.8V .
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 »

V rámci odstraňování možných problémových míst - skočte do IKEA a kupte tam balík 10 alkalických tužkových baterií za 59,- a používejte (prozatím) tyto místo akumulátorů.
Jinak pokud v baterii X článků některé mají 1,1V a jiné 0,5V tak ty co mají 0,5V jsou už dávno zničené, protože při běžném odběru z robota je ostatní baterie přepólují a proud jimi protéká opačně (jako byste je dal do nabíječky obráceně)

Jenom poznámka bokem - když sleduju Vaše problémy - ještě že před roboty jsem měl radioamatérskou minulost a zkušenost, protože tam bylo přirozené, že vysílačka vyzařuje 100W na 14MHz a v každém drátu indukuje napětí v desítkách až stovkách voltů - tím že jsme se naučili s tím žít - potom motorky od robotů jsou muška.
"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 »

Tak jsem celého robota překopal od začátku.Jednotlivé řídící prvky jsou samostatné bloky, je to taková skládačka.Toto řešení mi tu bylo dříve doporučeno.Taky jsem tentokrát zvolil klasický lineární stabilizítor l4940v5 místo pulzního zdroje.
Celé to řídíjeden mikroprocesor(arduino uno) a po dřívějších problémech s h můstkem a rušeím od motorů jsem sáhl po motor shieldu s l298.

Jaké to bylo příjemné překvapení, když po zapnutí to normálně fungovalo nelze popsat.Jenže dnes jsem si přidal další podprogram pro jízdu po čáře, velmi jednoduchý a nijak dokonalý program.Problém je, že hned po zapnutí programu s čárou se procesor prostě resetuje.Pokud spustím program se snímáním překážek ultrazvukem tak vše funguje.Rušením motorů by to tedy být nemělo.Ikdyž možná někdo zase řekne, že kabely od motorů mám táhlé kolem různě citlivých obvodů atd. ,ale takových robotů jsem viděl desítky a dá se říct, že to byli spíše pojízdné klubka drátů.

Není možné, že program, který se opakuje neustále dokola ve velmi krátkých časových intervalech se po určitém počtu opakování resetuje nebo že se mu zaplní paměť pro nějaké návratové body s podprogramu?Tento jev jsem pozoroval už u obyčejného blikání lekdy o vysoké frekvenci.Program udělal několik cyklů a pak ledka přestala blikat.Jaký má procesor důvod k samovolnému resetu?Všechny programy jsou jako podprogramy, které si pak volají další podprogrami.
Podle mě to nějak souvisí se zaplněnou pamětí( myslím, že to tady už někdo i dřívě zmiňoval)

Přikládám program.Ve smyčce loop si zvolím podprogram(ultrazvuk nebo jízdu po čáře) pak si podprogram ještě volá další podrogram pro řízení motorů nebo měření vdzálenosti.
Pro volbu programu používám několik tlačítek zapojených jako odporový dělič a svedené na jeden analogový vstup arduina.Tlačítko 1 má po stisknutí na výstupu 1V, tlačítko 2 2V atd.V programu se napětí převede na hodnoty 100,200....
dle hodnoty se pak volá odpovídající podprogram.Jelikož napětí není přesné tak tam jsou určité tolerance od do.

Kód: Vybrat vše

#include<Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

int ir_prave_kraj;
int ir_prave_stred;
int ir_leve_stred;
int ir_leve_kraj;
int tlacitko=0;
int tlacitka=0;
int senzor=0;
int senzormap=0;


const int pingPin = 4;
Servo myservo;
long duration, cm;
LiquidCrystal_I2C lcd(0x27,16,2);


void setup() {
    
  myservo.attach(2);
  myservo.write(80);
  lcd.init(); 
  lcd.backlight();
  pinMode(3,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(13,OUTPUT); 
  pinMode(5,OUTPUT); 
  pinMode(ir_prave_kraj,INPUT);
  pinMode(ir_prave_stred,INPUT);
  pinMode(ir_leve_stred,INPUT);
  pinMode(ir_leve_kraj,INPUT);
  digitalWrite(5,HIGH);
  }
  
  
void loop()   {                                          
      tlacitka=analogRead(A0);
      tlacitko=map(tlacitka,0,1023,0,500);
      lcd.backlight();
      lcd.clear();
      lcd.print("ZVOLTE PROGRAM");
      delay(700);
      
    if(tlacitko<105&&tlacitko>89)   {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("PROGRAM :");
      lcd.setCursor(0,1);
      lcd.print("ULTRAZVUK");
      delay(2000); 
      ultrazvuk(); 
      }  
      
      
    if(tlacitko<210&&tlacitko>190)   {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("PROGRAM :");
      lcd.setCursor(0,1);
      lcd.print("CARA");
      delay(2000); 
      cara(); 
      }   
} 
        
        
        
////////////////////////////////////////////////////////////////        
void ultrazvuk()  {
  
      senzor=analogRead(A1);                                            //toto je snímání intenzity světla pro zapnutí led osvětlení
      senzormap=map(senzor,0,1023,0,500);
   if(senzormap>240)   {
      digitalWrite(5,LOW);
      }
   if(senzormap<240)   {
      digitalWrite(5,HIGH);
      }
      myservo.write(80);//stred
      delay(200);
      ultrazvuk_mereni();
      
   if(cm<=15)  {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("STOP"); 
      lcd.setCursor(0,1);
      lcd.print("PREKAZKA:");
      lcd.print(cm);
      lcd.print("cm");    
   
po_couvani:    

      motory_stop();
      delay(500);
      myservo.write(150);//doprava
      delay(400);
      ultrazvuk_mereni();
      char data_ultrazvuk_vpravo=cm;
      myservo.write(20);//doleva
      delay(600);
      ultrazvuk_mereni();
      char data_ultrazvuk_vlevo=cm; 
      myservo.write(80);//stred
      delay(200);
      
   if(data_ultrazvuk_vlevo<=13&&data_ultrazvuk_vpravo<=13)    {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("COUVAT");
      lcd.setCursor(0,1);
      lcd.print("PREKAZKA:");
      lcd.print(cm);
      lcd.print("cm");
      motory_vzad();
      delay(1000);
      goto po_couvani;
      }
            
   if(data_ultrazvuk_vlevo>13)   {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("ZATOCIT DOLEVA");
      lcd.setCursor(0,1);
      lcd.print("PREKAZKA:");
      lcd.print(cm);
      lcd.print("cm");
      motory_stop();
      delay(10);
      zatocit_doleva();
      delay(900);
      ultrazvuk();
      }  
             
   if(data_ultrazvuk_vpravo>13)   {  
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("ZATOCIT DOPRAVA");
      lcd.setCursor(0,1);
      lcd.print("PREKAZKA:");
      lcd.print(cm);
      lcd.print("cm");
      motory_stop();
      delay(10);
      zatocit_doprava();
      delay(1400);
      ultrazvuk();     
      }
      
      
      }
      
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("VPRED");
      lcd.setCursor(0,1);
      lcd.print("PREKAZKA:");
      lcd.print(cm);
      lcd.print("cm");
      motory_vpred();
      myservo.write(150);//doprava
      delay(400);
      ultrazvuk_mereni();
      myservo.write(80);//stred
      delay(200);  
      char data_ultrazvuk=cm;
      
    if(data_ultrazvuk<=15)   {
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("ZAHNOUT DOLEVA");
      lcd.setCursor(0,1);
      lcd.print("PREKAZKA:");
      lcd.print(cm);
      lcd.print("cm");
      motory_stop();
      zatocit_doleva();
      delay(500);
      motory_vpred(); 
      ultrazvuk();
      }
      
      myservo.write(20);//doleva
      delay(400);
      ultrazvuk_mereni();
      myservo.write(80);//stred
      delay(200);
      data_ultrazvuk=cm;
      
    if(data_ultrazvuk<=15)   {
       lcd.clear();
       lcd.setCursor(0,0);
       lcd.print("ZAHNOUT DOPRAVA");
       lcd.setCursor(0,1);
       lcd.print("PREKAZKA:");
       lcd.print(cm);
       lcd.print("cm");
       motory_stop();
       zatocit_doprava();
       delay(500);
       motory_vpred(); 
       ultrazvuk();
       }
       
      motory_vpred();       
      ultrazvuk();
      }     
   
/////////////////////////////////////////////////////////////////   
   
   
void cara()   {
  
      senzor=analogRead(A1);                             //opět snímání intenzity světla
      senzormap=map(senzor,0,1023,0,500);
   if(senzormap>240)   {
      digitalWrite(5,LOW);
      }
   if(senzormap<240)   {
      digitalWrite(5,HIGH);
      }
      
     ir_leve_stred=digitalRead(8);
     ir_prave_stred=digitalRead(7);
     ir_prave_kraj=digitalRead(6);
     ir_leve_kraj=digitalRead(9);
     delay(10);
     
   if(ir_leve_stred==LOW&&ir_prave_stred==LOW)    {
      motory_vpred();
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("VPRED");
      cara(); 
      }
      
   if(ir_leve_stred==HIGH)   {
      zatocit_doleva();
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("ZATOCIT DOLEVA");
      cara(); 
      }   
      
   if(ir_prave_stred==HIGH)   {
      zatocit_doprava();
      lcd.clear();
      lcd.setCursor(0,0);
      lcd.print("ZATOCIT DOPRAVA");
      cara(); 
      } 
      cara();  
}   
   
   
void ultrazvuk_mereni()   {
    
    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);
    delay(10);
    cm = microsecondsToCentimeters(duration);
    }
     
     long microsecondsToCentimeters(long microseconds){
     return microseconds / 29 / 2;
     }     
    
    
    
    
void motory_vpred()  {
    
  analogWrite(3,130);
  digitalWrite(12,HIGH); 
  analogWrite(11,130);
  digitalWrite(13,HIGH);
  }
  
  
void motory_vzad()  {
    
  analogWrite(3,130);
  digitalWrite(12,LOW); 
  analogWrite(11,130);
  digitalWrite(13,LOW);
  }  
  
void motory_stop()   {
  
  digitalWrite(3,LOW);
  digitalWrite(12,LOW); 
  digitalWrite(11,LOW);
  digitalWrite(13,LOW);
  }
  
void zatocit_doprava()   {
  analogWrite(3,130);
  digitalWrite(12,LOW); 
  analogWrite(11,130);
  digitalWrite(13,HIGH);
  }
  
  
void zatocit_doleva()   {
  analogWrite(3,130);
  digitalWrite(12,HIGH); 
  analogWrite(11,130);
  digitalWrite(13,LOW);
  }
  
Přílohy
IMG478.jpg
IMG477.jpg
IMG475.jpg
Odpovědět