Skocz do zawartości

Arduino, problem z oprogramowaniem LF


viper_dp

Pomocna odpowiedź

Witam serdecznie.

Mam następujący problem.

Robot podąża za czarną linią i kiedy przestrzeli zakręt ( 3 czujniki nie widzą lini)

kontynuje jazdę do przodu.

Doczytałem że powinien kontynuować ostatni manewr lecz nie mam pomysłu jak to zrealizować. Widziałem że wstawia się "flagę" do każdego manewru póżniej pewnie trzeba ją sprawdzać (wstawiłem wskaźniki przy każdym manewrze).

Nie mam pomysłu jak to zrealizować.

Proszę o pomoc.

poniżej mój kod:

#include <LiquidCrystal.h> //biblioteka do obslugi LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //LCD podpięty pod te piny
int irLPin = 0;            // Analog PIN 0; Left IR
int irCPin = 1;            // Analog PIN 1; Center IR
int irRPin = 2;            // Analog PIN 2; Right IR
int irLval;  // Left IR 
int irCval;  // Center IR
int irRval;  // Right IR 
const int lewy1Pin = 32;    // lewy silnik 32
const int lewy2Pin = 34;    // lewy silnik 34
const int prawy1Pin = 36;// prawy 36
const int prawy2Pin = 38;//prawy 36
const int lewyonPin = 8;   // wlacz lewy H-bridge 
const int prawyonPin = 9; // wlacz prawy H-bridge
const int ledPin = 13;      // LED 
int j;
int czulosc = 500; //czulosc czujnikow IR
const int czujnik = 5;
int dystans = 0; 
int i;
int PWM1 = 127; //wypelnienie PMW max 255 tu 1/2 max
int PWM2 = 64;  //wypelnienie PMW tu 1/4 max
int pozycja; // ostatnia pozycja czujnikow

void setup()
{
 lcd.begin(16, 2); // inicjuj lcd 16x2 
 pinMode(irLPin, INPUT); // ustawienie pinu czujnikow jako wejscia
 pinMode(irCPin, INPUT);
 pinMode(irRPin, INPUT);

 pinMode(ledPin, OUTPUT); // ustawienie pinu LED jako wyjscia
 // ustawienia wyjsc silnika
 pinMode(lewy1Pin, OUTPUT); 
 pinMode(lewy2Pin, OUTPUT); 
 pinMode(prawy1Pin, OUTPUT);
 pinMode(prawy2Pin, OUTPUT);
 pinMode(lewyonPin, OUTPUT);
 pinMode(prawyonPin, OUTPUT);
 pinMode(czujnik, INPUT); // ustawienie wyjscia SHARP


 // wlaczenie silnikow lewy,prawy
 analogWrite(lewyonPin, 255); //wlacz prawy z pelnym wypelnieniem PWM
 analogWrite(prawyonPin, 255);//wlacz lewy z pelnym wypelnieniem PWM

}

void loop() 
{
 Look();
 sterowanie();
 LCD();
 //sprawdzanie();
}

void Look() //sprawdz czujniki 
{
 for (j =0; j <3; j++)
 {
 irLval = analogRead(irLPin);
 irCval = analogRead(irCPin);
 irRval = analogRead(irRPin);
 dystans = analogRead(czujnik); //oczytaj warotsc z SHARP
 }
 //delay(50);
}

void jedz() // jedz do przodu
{
 analogWrite(lewyonPin, PWM1); //wlacz prawy
 analogWrite(prawyonPin, PWM1);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);   // do przodu sil1
 digitalWrite(lewy2Pin, HIGH);  // do przodu sil1
 digitalWrite(prawy1Pin, LOW);   // do przodu sil2
 digitalWrite(prawy2Pin, HIGH);// do produ sil2
}
void wstecz()//jedz w tyl
{
 analogWrite(lewyonPin, PWM1); //wlacz prawy
 analogWrite(prawyonPin, PWM1);//wlacz lewy
 digitalWrite(lewy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(lewy2Pin, LOW);   // set leg 2 of the H-bridge low
 digitalWrite(prawy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(prawy2Pin, LOW); 
}  
void tyllewo()
{
 analogWrite(lewyonPin, PWM1); //wlacz prawy
 analogWrite(prawyonPin, PWM2);//wlacz lewy
 digitalWrite(lewy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(lewy2Pin, LOW);   // set leg 2 of the H-bridge low
 digitalWrite(prawy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(prawy2Pin, LOW); 
}
void tylprawo()
{
 analogWrite(lewyonPin, PWM2); //wlacz prawy
 analogWrite(prawyonPin, PWM1);//wlacz lewy
 digitalWrite(lewy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(lewy2Pin, LOW);   // set leg 2 of the H-bridge low
 digitalWrite(prawy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(prawy2Pin, LOW); 
}
void owlewo() //skrec ostro w prawo
{
 analogWrite(lewyonPin, PWM1); //wlacz prawy
 analogWrite(prawyonPin, 0);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);  // przod
 digitalWrite(lewy2Pin, HIGH);   // przod
 digitalWrite(prawy1Pin, LOW);   // tyl
 digitalWrite(prawy2Pin, HIGH); // tyl

}
void wlewo() //skrec w prawo
{
 analogWrite(lewyonPin, PWM1); //wlacz prawy
 analogWrite(prawyonPin, PWM2);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);  // przod
 digitalWrite(lewy2Pin, HIGH);   // przod
 digitalWrite(prawy1Pin, LOW);   // tyl
 digitalWrite(prawy2Pin, HIGH); // tyl

}


void wprawo() // skrec w lewo
{
 analogWrite(lewyonPin, PWM2); //wlacz prawy
 analogWrite(prawyonPin, PWM1);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);  // tyl
 digitalWrite(lewy2Pin, HIGH);   // tyl
 digitalWrite(prawy1Pin, LOW);   // przod
 digitalWrite(prawy2Pin, HIGH); // przod

} 
void owprawo() // skrec ostro w lewo
{
 analogWrite(lewyonPin, 0); //wlacz prawy
 analogWrite(prawyonPin, PWM1);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);  // tyl
 digitalWrite(lewy2Pin, HIGH);   // tyl
 digitalWrite(prawy1Pin, LOW);   // przod
 digitalWrite(prawy2Pin, HIGH); // przod
 } 

void stoj()
{
 analogWrite(lewyonPin, 0); //wlacz prawy
 analogWrite(prawyonPin, 0);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);  // tyl stop
 digitalWrite(lewy2Pin, LOW);   // tyl stop
 digitalWrite(prawy1Pin, LOW);   // przod stop
 digitalWrite(prawy2Pin, LOW); // przod stop
}

void LCD()
{
 lcd.setCursor(0,0);
 lcd.print("L");
 lcd.print(irLval);
 //lcd.setCursor(0,5);
 lcd.print("C");
 lcd.print(irCval);
 //lcd.setCursor(0,13);
 lcd.print("R");
 lcd.print(irRval);
 //delay(100);
 //lcd.setCursor(0,0);
 //lcd.print("L    ");
 //lcd.setCursor(0,5);
 //lcd.print("C    ");
 //lcd.setCursor(0,13);
 //lcd.print("R    ");
 //delay(100);
 lcd.setCursor(1,1);
 lcd.print("Dystans:"); // wyświetl wartość dla dystansu
 lcd.print(dystans);
 delay(100);
}


void sterowanie()
{
 if ((irLval >czulosc) && (irCval <czulosc) && (irRval >czulosc))
 {
   pozycja = 0; 
   jedz();
   }
 if((irLval <czulosc) && (irCval >czulosc) && (irRval >czulosc))
 {
   pozycja = -20;
   wprawo();
 }
 if((irLval >czulosc) && (irCval >czulosc) && (irRval <czulosc))
 {
   pozycja = 20;
   wlewo();

 }
 if((irLval <czulosc) && (irCval <czulosc) && (irRval >czulosc))
 {
   pozycja = -10;
   owprawo();

 }
 if((irLval >czulosc) && (irCval <czulosc) && (irRval <czulosc))
 {
   pozycja = 10;
   owlewo();
 }  
 if((irLval >czulosc) && (irCval >czulosc) && (irRval >czulosc))
 {
 if (pozycja <0)
 {
   pozycja = -30;
 }
 else
 {
   pozycja = 30;
 }
   stoj();
 }
}
Link do komentarza
Share on other sites

Możesz podzielić funkcję sterowanie() na dwie części. Oddzielnie podejmować decyzję (logika programu) gdzie jechać, oddzielnie wykonywać polecenie (sterowanie silnikiem).

Dodatkowo warto przechowywać ostatnią decyzję w zmiennej np. globalnej.

Czyli:

1) zdefiniuj zmienną globalną:

int kierunek = KIERUNEK_PROSTO;

;

2) zdefiniuj wartości dla zmiennej kierunek:

enum {
 KIERUNEK_PROSTO, KIERUNEK_STOP, KIERUNEK_PRAWO, KIERUNEK_LEWO, ... };

3) zamiast funkcji sterowanie() utwórz 2 funkcje: ustal_kierunek() i steruj_silnikiem()

void ustal_kierunek() {
 if ((irLval >czulosc) && (irCval <czulosc) && (irRval >czulosc)) {
   kierunek = KIERUNEK_PROSTO;
 } else if((irLval <czulosc) && (irCval >czulosc) && (irRval >czulosc)) {
   kierunek = KIERUNEK_PRAWO;
 } 
 ...
}

void steruj_silnikiem() {
 switch (kierunek) {
 case KIERUNEK_PROSTO:
   jedz();
   break;
 case KIERUNEK_STOP:
  ....
 }
}

W takiej wersji, jeśli funkcja ustal_kierunek() nie zmieni kierunku, robot będzie jechał zgodnie z poprzednią decyzją.

A przy okazji masz oddzielony kod podejmujący decyzje od wykonawczego.

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

Dziękuję Elvis za podpowiedź.

Zgodnie z sugestią podzieliłem cześć kodu na sprawdzenie kierunku i wykonanie ruchu.

Niestety przy programowaniu ARDUINIO MEGA nie mogłem zastosować tej części kodu:

enum { 
 KIERUNEK_PROSTO, KIERUNEK_STOP, KIERUNEK_PRAWO, KIERUNEK_LEWO, ... };

(nie przypisywał kolejnych wartości do wyrażeń KIERUNEK_PROSTO itd.)

Zainicjowanie zmiennej globalnej w takiej postaci też nie było możliwe:

int kierunek = KIERUNEK_PROSTO;

Zamiast tego zmiennej kierunek przypisałem na wstępie wartość = 1

int kierunek = 1; // jak przy jeździe do przodu

a przy sprawdzaniu kierunku nadaję zmiennej kierunek kolejne wartości:

if ((irLval >czulosc) && (irCval <czulosc) && (irRval >czulosc)) { 
   kierunek = 1;
}
else if((irLval <czulosc) && (irCval >czulosc) && (irRval >czulosc)) { 
   kierunek = 2; 
 } 
 ...

Później w sterowaniu silnikiem odczytuję warość kierunek i steruję:

switch (kierunek) { 
 case 1: 
   jedz(); 
   break; 
 case 2:
   prawo();
   break;
...

Rozumię że taka metoda też jest poprawna?

Teraz robot kontynuje zakręt i jest już OK, choć bardzo zygzakuje.

Pozostaje mi zgłebić tajniki implementacji PID 🙂)

Pozdrawiam i dziękuję

VIPER

Link do komentarza
Share on other sites

Jest jak najbardziej poprawna. Ma tylko taką wadę, że za rok ciężko sobie przypomnieć co znaczy "kierunek = 2".

Jeśli enum nie działa można wykorzystać instrukcję #define, czyli

#define KIERUNEK_PROSTO   1
#define KIERUNEK_STOP   2
#define KIERUNEK_PRAWO  3 
#define KIERUNEK_LEWO   4
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

Wydaje mi się, że enum też powinno działać, tylko powinno być coś takiego:

enum NKierunek{
KIERUNEK_PROSTO, KIERUNEK_STOP, KIERUNEK_PRAWO, KIERUNEK_LEWO};

NKierunek kierunek = KIERUNEK_PROSTO;

//reszta kodu 
Link do komentarza
Share on other sites

Aby rozwiać wątpliwości przy ARDUINO "enum" nie występuje w standardowych poleceniach.

Żeby użyć go należy umieścić je w dodatkowym pliku .H

Czyli w tym przypadku "kierunek.h" i wywołać w globalnych ustawieniach na począktu pliku PDE przez # include kierunek.h

Doczytałem to oczywiście na forum Arduino arduino forum po Waszej dyskusji.

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

Nie chciało mi się wierzyć, że enum nie działa. I słusznie, pobrałem kompilator arduino i sprawdziłem. Działa dokładnie jak w C.

Nie lubię wklejać kodów na forum, ale tym razem zrobię wyjątek:

#include <LiquidCrystal.h> //biblioteka do obslugi LCD

enum { KIERUNEK_STOP, KIERUNEK_PROSTO, KIERUNEK_W_LEWO, KIERUNEK_OW_LEWO, KIERUNEK_W_PRAWO, KIERUNEK_OW_PRAWO };

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //LCD podpięty pod te piny
int irLPin = 0;            // Analog PIN 0; Left IR
int irCPin = 1;            // Analog PIN 1; Center IR
int irRPin = 2;            // Analog PIN 2; Right IR
int irLval;  // Left IR
int irCval;  // Center IR
int irRval;  // Right IR
const int lewy1Pin = 32;    // lewy silnik 32
const int lewy2Pin = 34;    // lewy silnik 34
const int prawy1Pin = 36;// prawy 36
const int prawy2Pin = 38;//prawy 36
const int lewyonPin = 8;   // wlacz lewy H-bridge
const int prawyonPin = 9; // wlacz prawy H-bridge
const int ledPin = 13;      // LED
int j;
int czulosc = 500; //czulosc czujnikow IR
const int czujnik = 5;
int dystans = 0;
int i;
int PWM1 = 127; //wypelnienie PMW max 255 tu 1/2 max
int PWM2 = 64;  //wypelnienie PMW tu 1/4 max
int kierunek = KIERUNEK_PROSTO; // kierunek jazdy robota

void setup()
{
 lcd.begin(16, 2); // inicjuj lcd 16x2
 pinMode(irLPin, INPUT); // ustawienie pinu czujnikow jako wejscia
 pinMode(irCPin, INPUT);
 pinMode(irRPin, INPUT);

 pinMode(ledPin, OUTPUT); // ustawienie pinu LED jako wyjscia
 // ustawienia wyjsc silnika
 pinMode(lewy1Pin, OUTPUT);
 pinMode(lewy2Pin, OUTPUT);
 pinMode(prawy1Pin, OUTPUT);
 pinMode(prawy2Pin, OUTPUT);
 pinMode(lewyonPin, OUTPUT);
 pinMode(prawyonPin, OUTPUT);
 pinMode(czujnik, INPUT); // ustawienie wyjscia SHARP


 // wlaczenie silnikow lewy,prawy
 analogWrite(lewyonPin, 255); //wlacz prawy z pelnym wypelnieniem PWM
 analogWrite(prawyonPin, 255);//wlacz lewy z pelnym wypelnieniem PWM

}

void loop()
{
 Look();
 decyzja();
 sterowanie();
 LCD();
 //sprawdzanie();
}

void Look() //sprawdz czujniki
{
 for (j =0; j <3; j++)
 {
 irLval = analogRead(irLPin);
 irCval = analogRead(irCPin);
 irRval = analogRead(irRPin);
 dystans = analogRead(czujnik); //oczytaj warotsc z SHARP
 }
 //delay(50);
}

void jedz() // jedz do przodu
{
 analogWrite(lewyonPin, PWM1); //wlacz prawy
 analogWrite(prawyonPin, PWM1);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);   // do przodu sil1
 digitalWrite(lewy2Pin, HIGH);  // do przodu sil1
 digitalWrite(prawy1Pin, LOW);   // do przodu sil2
 digitalWrite(prawy2Pin, HIGH);// do produ sil2
}
void wstecz()//jedz w tyl
{
 analogWrite(lewyonPin, PWM1); //wlacz prawy
 analogWrite(prawyonPin, PWM1);//wlacz lewy
 digitalWrite(lewy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(lewy2Pin, LOW);   // set leg 2 of the H-bridge low
 digitalWrite(prawy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(prawy2Pin, LOW);
} 
void tyllewo()
{
 analogWrite(lewyonPin, PWM1); //wlacz prawy
 analogWrite(prawyonPin, PWM2);//wlacz lewy
 digitalWrite(lewy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(lewy2Pin, LOW);   // set leg 2 of the H-bridge low
 digitalWrite(prawy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(prawy2Pin, LOW);
}
void tylprawo()
{
 analogWrite(lewyonPin, PWM2); //wlacz prawy
 analogWrite(prawyonPin, PWM1);//wlacz lewy
 digitalWrite(lewy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(lewy2Pin, LOW);   // set leg 2 of the H-bridge low
 digitalWrite(prawy1Pin, HIGH);  // set leg 1 of the H-bridge high
 digitalWrite(prawy2Pin, LOW);
}
void owlewo() //skrec ostro w prawo
{
 analogWrite(lewyonPin, PWM1); //wlacz prawy
 analogWrite(prawyonPin, 0);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);  // przod
 digitalWrite(lewy2Pin, HIGH);   // przod
 digitalWrite(prawy1Pin, LOW);   // tyl
 digitalWrite(prawy2Pin, HIGH); // tyl

}
void wlewo() //skrec w prawo
{
 analogWrite(lewyonPin, PWM1); //wlacz prawy
 analogWrite(prawyonPin, PWM2);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);  // przod
 digitalWrite(lewy2Pin, HIGH);   // przod
 digitalWrite(prawy1Pin, LOW);   // tyl
 digitalWrite(prawy2Pin, HIGH); // tyl

}


void wprawo() // skrec w lewo
{
 analogWrite(lewyonPin, PWM2); //wlacz prawy
 analogWrite(prawyonPin, PWM1);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);  // tyl
 digitalWrite(lewy2Pin, HIGH);   // tyl
 digitalWrite(prawy1Pin, LOW);   // przod
 digitalWrite(prawy2Pin, HIGH); // przod

}
void owprawo() // skrec ostro w lewo
{
 analogWrite(lewyonPin, 0); //wlacz prawy
 analogWrite(prawyonPin, PWM1);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);  // tyl
 digitalWrite(lewy2Pin, HIGH);   // tyl
 digitalWrite(prawy1Pin, LOW);   // przod
 digitalWrite(prawy2Pin, HIGH); // przod
 }

void stoj()
{
 analogWrite(lewyonPin, 0); //wlacz prawy
 analogWrite(prawyonPin, 0);//wlacz lewy
 digitalWrite(lewy1Pin, LOW);  // tyl stop
 digitalWrite(lewy2Pin, LOW);   // tyl stop
 digitalWrite(prawy1Pin, LOW);   // przod stop
 digitalWrite(prawy2Pin, LOW); // przod stop
}

void LCD()
{
 lcd.setCursor(0,0);
 lcd.print("L");
 lcd.print(irLval);
 //lcd.setCursor(0,5);
 lcd.print("C");
 lcd.print(irCval);
 //lcd.setCursor(0,13);
 lcd.print("R");
 lcd.print(irRval);
 //delay(100);
 //lcd.setCursor(0,0);
 //lcd.print("L    ");
 //lcd.setCursor(0,5);
 //lcd.print("C    ");
 //lcd.setCursor(0,13);
 //lcd.print("R    ");
 //delay(100);
 lcd.setCursor(1,1);
 lcd.print("Dystans:"); // wyświetl wartość dla dystansu
 lcd.print(dystans);
 delay(100);
}

void decyzja ()
{
 if ((irLval >czulosc) && (irCval <czulosc) && (irRval >czulosc)) {
   kierunek = KIERUNEK_PROSTO;
 } else if((irLval <czulosc) && (irCval >czulosc) && (irRval >czulosc)) {
   kierunek = KIERUNEK_W_PRAWO;
 } else if((irLval >czulosc) && (irCval >czulosc) && (irRval <czulosc)) { 
   kierunek = KIERUNEK_W_LEWO;
 } else if((irLval <czulosc) && (irCval <czulosc) && (irRval >czulosc)) {
   kierunek = KIERUNEK_OW_PRAWO;
 } else if((irLval >czulosc) && (irCval <czulosc) && (irRval <czulosc)) {
   kierunek = KIERUNEK_OW_LEWO;
 } if((irLval >czulosc) && (irCval >czulosc) && (irRval >czulosc)) {
   kierunek = KIERUNEK_STOP;
 }
}

void sterowanie()
{
 static int kierunek_poprzedni = KIERUNEK_STOP; // poprzedni kierunek jazdy

 if (kierunek_poprzedni==kierunek) 
   return;

 switch (kierunek) {
 case KIERUNEK_PROSTO:
   jedz();
   break;
 case KIERUNEK_W_LEWO:
   wlewo();
   break;
 case KIERUNEK_OW_LEWO:
   owlewo();
   break;
 case KIERUNEK_W_PRAWO:
   wprawo();
   break;
 case KIERUNEK_OW_PRAWO:
   owprawo();
   break;
 case KIERUNEK_STOP:
 default:
   stoj();
   break;
 }  
 kierunek_poprzedni=kierunek;
}

[ Dodano: 22 Mar 10 10:02 ]

Nigdy wcześniej arduino nie używałem, ale jak już pobrałem postanowiłem sprawdzić, co to takiego.

Więc jest to najzwyklejsze C, kompilator to najzwyklejszy WinAVR, czyli gcc. W katalogu arduino-0018\hardware\tools\avr jest cały pakiet.

Czyli jak ktoś poznał arduino to przy okazji nauczył się C.

Poza WinAVR arduino daje jakieś IDE napisane w Javie (ja wolę AVRStudio, ale co kto lubi).

Najciekawsze są biblioteki. W katalogu arduino-0018\libraries są gotowe biblioteki do obsługi LCD, eeprom, servo, silnika krokowego i wielu innych. Napisane są w standardowym C++, więc nawet jeśli ktoś nie planuje używać arduino może te biblioteki wykorzystać.

Link do komentarza
Share on other sites

Nie chciało mi się wierzyć, że enum nie działa. I słusznie, pobrałem kompilator arduino i sprawdziłem. Działa dokładnie jak w C.

Przepraszam za zamieszanie. Prawdą jest iż w standardowych referencjach "enum" nie występuje Arduino - Reference

Jak widać działa przy odpowiednim podejciu do tematu fachowca 🙂

Ja wybrałem Arduino ze względu na to, iż z programowaniem w C czy C++, nie miałem do tej pory do czynienia, a mnogość gotowych bibliotek tworzonych przez użytkowników Arduino pomaga bezboleśnie przebrnąć przez proces adaptacji i oprogramowania.

Dziękuję jeszcze raz wszystkim za zainteresowanie i pomoc.

Elvis'owi szczególnie za zrobienie wyjątku ze wstawieniem kodu 🙂

Dla zainteresowanych bibliotekami do Arduino

link

Do zastosowań w robotyce np. PID Control, Ultrasonic Sensor itd. .

Pozdrawiam

VIPER

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!

Anonim
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.