Skocz do zawartości

Pierwszy robot.


Danielos01

Pomocna odpowiedź

Witam ponownie,
zacząłem programować robota ale nie wiedziałem do końca jak się za to zabrać więc poszukałem strony gdzie jest gotowy program:

http://electropark2.blogspot.com/

Po skopiowaniu kodu wyskoczył komunikat:

exit status 1

'getDistance' was not declared in this scope

#include <AFMotor.h>

AF_DCMotor motor1(3); //M3 - motor lewy
AF_DCMotor motor2(2); //M2 - motor prawy

#define echoPin A1 // Echo Pin = Analog Pin A1
#define trigPin 9 // Trigger Pin = Digital Pin 9 - Servo 2
#define LEDPin 13 // Onboard LED

long duration; // Duration used to calculate distance
long HR_dist=0; // Calculated Distance
int minimumRange=5; //Minimum Sonar range
int maximumRange=200; //Maximum Sonar Range


void setup() {

Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)

motor1.setSpeed(250);//prędkość silnika lewego
motor1.run(FORWARD);//silnik lewy domyślnie do przodu
motor2.setSpeed(255);//prędkość silnika prawego
motor2.run(FORWARD);//silnik prawy domyślnie do przodu

}

void loop() {

motor1.run(FORWARD); //silnik lewy M3 do przodu
motor2.run(FORWARD);//silnik prawy M2 do przodu
getDistance();
void getDistance(){ 

digitalWrite(trigPin, LOW); 
delayMicroseconds(2); 
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); 
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH); 
HR_dist = duration/58.2;

if (HR_dist >= maximumRange || HR_dist <= minimumRange){

Serial.println("0");
digitalWrite(LEDPin, HIGH); 

} else {

Serial.println(HR_dist);
digitalWrite(LEDPin, LOW);


if (HR_dist <=30 ){//jeżeli robot jest w odległości od przeszkody <=30

motor1.run(RELEASE);//silnik lewy bieg jałowy
motor2.run(RELEASE);//silnik prawy bieg jałowy
delay (500);//przez pół sekundy

motor1.run(BACKWARD);//silnik lewy do tyłu
motor2.run(BACKWARD);//silnik prawy do tyłu
delay (700);//przez 0,7 sekundy

motor1.run(RELEASE);// silnik lewy bieg jałowy
motor2.run(RELEASE);// silnik prawy bieg jałowy
delay(500); //przez pół sekundy

motor1.run(FORWARD);//silnik lewy do przodu |robot skręca w prawo
motor2.run(RELEASE);//silnik prawy bieg jałowy |
delay (500);//przez pół sekundy 

}

}

}

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Witam,

w końcu ukończyłem robota. Wszystko działa prawie dobrze. Mam problem mianowicie. Po wgraniu kodu bez problemów trzymałem robota na biurku w powietrzu nieruchomo. wszystko działało koła kręciły się do przodu. Po zbliżeniu zeszytu(jako przeszkody) silniki się zatrzymuję, jeden zaczyna się kręcić do tyłu znika przeszkoda i silniki po czasie znowu zaczynają się obracać do przodu itd.

Jednak po odłączeniu go od USB i położeniu na ziemi robot zaczyna wariować, zaczyna się cały czas cofać jak by miał przed sobą przeszkodę po mimo jej braku. Robi to czasami 3 razy po czym dopiero jedzie do przodu. Gdy napotka przeszkodę(taka prawdziwą) to prawidłowo się wycofuje i pomimo wolnej przestrzeni powtarza to znowu 2 lub 3 razy.

Proszę o pomoc.

 #include <AFMotor.h>
   AF_DCMotor motor1(1);
   AF_DCMotor motor2(4);

 #define TRIG 10
 #define ECHO 9
void setup() {
motor1.setSpeed(130);
motor2.setSpeed(150);

pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
}

void loop() {
 digitalWrite(TRIG, HIGH);
 delayMicroseconds(10);
 digitalWrite(TRIG, LOW);

 int signalDelay = pulseIn(ECHO, HIGH);
 int distance = signalDelay/58;  
 delay(50);

if(distance>15){
 motor1.run(FORWARD);
 motor2.run(BACKWARD);
}
if(distance<=15){
 motor1.run(RELEASE);
 motor2.run(RELEASE);
 delay(50);
 motor2.setSpeed(250);
 motor2.run(FORWARD);
 delay(700);

}
}
Link do komentarza
Share on other sites

Może czujnik odbiciowy źle działa w pobliżu podłogi? Wywal z programu wszelkie sterowanie silnikami a tylko zapalaj diodkę LED gdy odległość z czujnika jest mniejsza niż ileśtam cm. Kładź go na podłodze w różnych miejscach pokoju lub zbliżaj do ściany trzymając w ręku np. metr nad podłogą i się przekonaj. Pisz sobie różne "podręczne" programy testowe które pokażą gdzie jest problem. Ładuj je do procesora i sprawdzaj. Być może czujnik musi patrzeć trochę pod kątem w górę, może widzi coś na robocie jeśli nie jest na krawędzi albo może musisz podnieść jego mocowanie?

Link do komentarza
Share on other sites

Na biurku jak trzymałem robota to wgrałem program żeby sprawdzić czujnik i w monitorze szeregowym wyświetlał dobre odległości. Sprawdzę jeszcze na ziemi jak się zachowuje i dam znać.

Po wgraniu kodu żeby wyświetlał odległość na monitorze wszystko dobrze działa na ziemi. Sprawdziłem duży obszar na ile pozwalał mi kabel i bez zarzutów. Po wgraniu znowu kodu do jazdy zaczęło się dobrze ale po napotkaniu drugiej przeszkody pojawił się na nowo problem.

Jestem poważnie zdziwiony. Nie wiem co jest grane ale kiedy Arduino mam podłączone do kompa przez USB a Motor Shielda na bateriach to wszystko działa prawidłowo. Kiedy Arduino i Shield jest zasilane z baterii to wariuje.

Co o tym sadzisz?

[ Dodano: 04-12-2016, 12:33 ]

Dzisiaj znowu robiłem próby i sam czujnik działa sprawnie. Pokazuje dobre odległości. jednak kiedy wgrałem program do sterowania silnikami i pokazywania odległości w monitorze szeregowym co jakiś czas czujnik wywala odległość na minusie np. -289 dodatkowo układ działa przez pewien czas i jak by się wyłączał bo robot staje, a czujnik nie podaje odległości.

Link do komentarza
Share on other sites

No to muszę Cię zmartwić, opisane objawy to na 90% problemy z zakłóceniami. Jeżeli programy i czujniki działają dobrze gdy jest cisza a zaczynają świrować w trochę przypadkowy sposób gdy silniki pracują, to musisz pochylić się nad magią: prowadzenie przewodów, filtry na silnikach, filtry na zasilaniach, punkty podłączenia mas i zasilań itd.

Zacznijmy od elementarza:

1. Czy silniki mają na swoich zaciskach kondensatory min. 100nF?

2. Czy kable zasilania są grube i krótkie?

3. Czy kable do silników są grube i krótkie?

4. Czy próbowałeś dodać na głównym zasilaniu (z akumulatora) tuż przy płytce kondensator 100-1000uF?

5. Czy próbowałeś dodać kondensator 100nF lub 100uF na zasilaniu samego czujnika? Jak go podłączyłeś

6. Jak w ogóle to zasilasz, w sensie sposobu prowadzenia kabli?

7. Jak to jest zbudowane w sensie mechanicznym? Czy możesz zapodać zdjęcie całości i krótko je opisać?

Link do komentarza
Share on other sites

Więc tak:

1. silniki są bezpośrednio połączone z Motor Shield(bez kondensatorów),
2.kable od baterii idą do wyłącznika( kable długie i cienkie fabryczne od koszyka na baterie) natomiast kabel plusowy z wyłącznika do Motor Shield jest krótki i grubszy (średnica ok.2 mm)

3. kable do silników mają około 13 cm średnica ok 2 mm i są połączone dwa razem do jednego silnika

4. nie dawałem żadnych kondensatorów, jedyne kondensatory jakie są to wbudowane w płytki

5. czujnik jest podłączony do Motor Shield ( piny od serwo) bez żadnych kondensatorów i rezystorów

To jest konstrukcja jeszcze prototypowa ponieważ nie wiem jak przymocować czujnik( na razie zamocowany na płytce stykowej):

Te białe kable podwójne to zasilania silników(przylutowane do silników i połączone z Shield)

Ten krótki brązowy przewód to plus zasilania z wyłącznika do Shielda

Te kolorowe przewody są z czujnika.

[ Dodano: 04-12-2016, 14:19 ]

Arduino i Motor Shield jest przymocowane śrubą do płytki.

[ Dodano: 04-12-2016, 14:21 ]

na zmontowanym tak robocie wgrałem kod do pomiaru odległości:

#define TRIG 10
#define ECHO 9

void setup(){
 //Set direction
 pinMode(TRIG, OUTPUT);
 pinMode(ECHO, INPUT);
 //Initialize serial
 Serial.begin(9600);
 Serial.println("--");

}
//Endless loop
void loop(){
 //Pulse to start measure with HC-SR04
 digitalWrite(TRIG, HIGH);
 delayMicroseconds(10);
 digitalWrite(TRIG, LOW);

 int signalDelay = pulseIn(ECHO, HIGH);
 int distance = signalDelay/58;

 Serial.print("Distance:");
 Serial.print(distance);
 Serial.println(" cm");

 delay(1000);
}

[ Dodano: 04-12-2016, 14:22 ]

Wyniki na monitorze szeregowym prawidłowe:

--

Distance:25 cm

Distance:25 cm

Distance:25 cm

Distance:25 cm

Distance:25 cm

Distance:25 cm

Distance:25 cm

Distance:8 cm

Distance:5 cm

Distance:25 cm

Distance:18 cm

Distance:25 cm

Distance:19 cm

Distance:15 cm

Distance:10 cm

Distance:6 cm

Distance:3 cm

Distance:3 cm

Distance:25 cm

[ Dodano: 04-12-2016, 14:25 ]

Jak wgrałem kod z ruchami robota i wyświetlaniem odległości to zaczyna działać dobrze lecz po chwili wszystko milknie robot nie działa.

Monitor szeregowy:

25

24

25

25

25

25

  #include <AFMotor.h>
   AF_DCMotor motor1(1);
   AF_DCMotor motor2(4);

 #define TRIG 10
 #define ECHO 9
void setup() {
motor1.setSpeed(130);
motor2.setSpeed(150);
Serial.begin(9600);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
}

void loop() {
 digitalWrite(TRIG, HIGH);
 delayMicroseconds(10);
 digitalWrite(TRIG, LOW);

 int signalDelay = pulseIn(ECHO, HIGH);
 int distance = signalDelay/58; 
 Serial.println(distance); 
 delay(50);

if(distance>15){
 motor1.run(FORWARD);
 motor2.run(BACKWARD);
}
if(distance<=15){
 motor1.run(RELEASE);
 motor2.run(RELEASE);
 delay(50);
 motor2.run(FORWARD);
 delay(700);

}
}

[ Dodano: 04-12-2016, 14:29 ]

Zapomniałem jeszcze dodać że zanim napisałem tutaj ten post to uruchomiłem robota na nowo i jeździł dobrze po czym wyłączyłem zasilanie i puściłem znowu i przestał działać. Tak więc prawidłowe działanie robota jest losowe.

Link do komentarza
Share on other sites

Przyczyna może być dużo bardziej trywialna: masz tylko 4xAA czyli 6V w porywach. To napięcie na granicy poprawnego działania stabilizatora na płycie Arduino. Wystarczy, że baterie choć troszeczkę się rozładują i zaczyna zjeżdżać 5V zasilające procesor i czujnik. Mostkom to nie szkodzi, ale np. precyzyjne układy analogowe w czujniku mogą wariować. To samo z prockiem.

Koniecznie zmierz multimetrem oba zasilania, czyli 6V przychodzące z baterii i 5V na Arduino/czujniku. Napisz program który włącza oba silniki na stałe (żadnych pomiarów odległości itp), podłącz się woltomierzem na kostkę wejściową shielda za wyłącznikiem (jego też przy okazji można podejrzewać) i sprawdź do ilu spada gdy ręką hamujesz jedno a potem oba koła. Jeżeli robi się poniżej 5.5V, masz problem. Dla pewności sprawdź w tych samych warunkach 5V wychodzące a Arduino i zasilające czujnik.

Niezależnie od wyniku znajdź 2 kondensatory ceramiczne 100nF i dolutuj każdemu silnikowi jeden, bezpośrednio na blaszkach.

  • Lubię! 1
Link do komentarza
Share on other sites

Jeszcze raz wielkie dzięki.

Przy tych bateriach co mam na rysunku faktycznie zasilanie było 5,5 V gdy robot chodził w powietrzu. Na czujniku na początku było poniżej 5 V i spadało coraz bardziej aż zaczynał wariować robot.

Teraz zastosowałem dodatkowo akumulatorki i napięcie na czujniku cały czas jest w granicach 5 V. Wszystko działa jeszcze tylko przylutuje kondensatorki do silników.

Dzięki wielkie.

Link do komentarza
Share on other sites

Witam,
zacząłem przerabiać swojego robota a dokładnie dodałem do niego sterowanie pilotem.

Wtedy pomyślałem że fajnie by było sterować telewizorem przez Arduino. Ściągnąłem bibliotekę IRremote i zczytałem kod z kilota na wszystkich przyciskach(telewizor marki LG), np POWER 20DF10EF.

W bibliotece jest także kod do wysyłania sygnału przez diodę IR.

#include <IRremote.h>

IRsend irsend;

void setup()
{
}

void loop() {
for (int i = 0; i < 3; i++) {
	irsend.NEC(0x20DF10EF, 32);
	delay(40);
}
delay(5000);
}


Po wgraniu kodu nic się nie dzieje, próbowałem także z gotowym kodem który jest w bibliotece ale też nie działa.

Diodę IR (HOYA)podłączyłem do pinu 3.

Link do komentarza
Share on other sites

Bardzo nam przykro. Skoro nawet gotowce nie działają, to musi być jakiś babol w sprzęcie. Oscyloskopu nie proponuję, musisz sobie radzić domowymi metodami: zamiast diodki podczerwonej, w to samo miejsce i tak samo podłącz zwykłego LEDa. Jeśli będzie zapalał się w sensowny sposób to jest szansa, że i Twój IRED nadaje poprawnie. Błyski w podczerwieni możesz "bezpośrednio" zobaczyć cyfrowym aparatem fotograficznym, np. kamerką telefonu. Upewnij się, że pin 3 jest w Twoim robocie nieużywany.

Jeszcze się nie nauczyłeś, że w takich wypadkach schemat jest obowiązkowy? Nawet jeśli jest to zwykła diodka. Musimy wiedzieć, że nie zrobiłeś czegoś głupiego.

Link do komentarza
Share on other sites

zacząłem więcej o tym czytać i znalazłem sensowną stronę(https://translate.googleusercontent.com/translate_c?depth=1&hl=pl&prev=search&rurl=translate.google.pl&sl=en&sp=nmt4&u=http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html&usg=ALkJrhg71SWjqJVvYU1g4yYsE5gV73HERQ) jednak dalej mam problem.

Kod i dioda są sprawne(testowałem je). Wiem że kod do Tv jest nadawany w protokole NEC. Nie mogłem za bardzo zrozumieć w jaki sposób wysyłać ten kod więc sczytałem kod podczerwieni do wieży(8087887) nie wim czy dobrze zrozumiałem ale wg mnie jest to protokół RC5. Więc wysyłałem podczerwień tym kodem:

#include <IRremote.h>

IRsend irsend;

void setup()
{
}

void loop() {
for (int i = 0; i < 3; i++) {
	irsend.sendRC5(808E817,7);
	delay(40);
}
delay(5000); //5 second delay between each signal burst
}

Nie wiem jak po kodzie otrzymany z pilote wiedzieć jaki protokół użyć, ijak ma wyglądać kod.

Co o tym sądzisz?

Link do komentarza
Share on other sites

Przepraszam, ale piszesz tak niedbale, że w sumie nawet nie staram się zrozumieć co tam kombinujesz. Może mam gorszy dzień..

Różne standardy IR to kompletnie różne sposoby kodowania bitów i formaty ramek. Odbiornik znający tylko jeden format w życiu nie odbierze danych nadawanych w innym. Na szczęście programiści piszący bibliotekę IRremote zrobili "inteligentny" dekoder, który potrafi samodzielnie zrozumieć jaki format jest używany.

Na tej stronie:

https://www.pjrc.com/teensy/td_libs_IRremote.html

masz pod tytułem "Example Program - Receive" przykład kodu odbierającego coś z IR i dzięki wbudowanej analizie, wypisującego nazwę standardu i kod. Zaraz poniżej jest przykład nadawania tego samego, tutaj akurat w formacie Sony. Spróbuj czegoś podobnego ze swoim pilotem i TV.

A jak tam sterowanie robotem? Jeździsz po pokoju? Może jakiś film?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.