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);
}