ROBO01

Powoli zbierąją się części do robota... tu czujnik tam czujnik, silnik, serwo, płytka sterująca. Ale wsyztstko trzeba zmontowac na czymś. Na początku myślałem gotowym rozwiązaniu oferowanym przez różne sklepy. Bardzo fajne rozwiązania ale drogie. Nie mniej jednak w przyszłości, jeżeli cokolwiek z tego hobby mi wyjdzie to z pewnośią będę inwestował w "dobre" podwozia. Oglądając najróżniejsze strony o robotach zauważyłem, że amatorzy tacy jak ja budują roboty z czego popadnie, nawet z kartonu. Więc siadłem i podumałem... z czego tu można by było zbudować podwozie... w domu znalazłem stare lego i coś co kiedyś nazywało się CONSTRUCTION.



Znalazłem w domu 3 zestawy... myślę że wystarczy na początek... Kilka elementów kilka śrubek, śrubokręt i klucz i zabawa gotowa. :) wszystko spakowałem w jedną skrzynkę i powoli skręcam różne konstrukcje. Nie mniej jednak w zestawach brakowało silników. Bez problemów na dzień dzisiejszy można swobodnie dokupić części... Firma zmieniła nazwę na EITECH, zmodernizowała się i działa dalej, prócz gotowych zestawów, za mniejsze pieniądze można dokupić różne zestawy elementów od listew, przez kółka po silniki.


No to mamy chyba wszystko do rozpoczęcia budowy pierwszej maszyny. Zobaczmy co może wyjść z połączenia kilku cześci?



Teraz trzeba znaleźć sposób na zaprogamowvanie... co z pewnością nie będzie proste... jak dla mnie...


PROJEKT SONAR HC-SR04
(Arduino / Motor Stepper Servo shield)

Pierwsze testy połączenia pracy sonaru i silnika nie powiodły się :( .W sumie sonar działał prawidłowo, silniki również... ale wszystko oddzielnie... po połączeniu obu rzeczy na raz sonar wariował... pokazywał odległość ponad 3,5 tyś cm i utknąłem... Po kilku nieprzespanych nocach... eureka :) silniki są tak głośne że zakłócają pracę sonaru i nie jest w stanie mierzyć odległości... dlatego też stworzyłem poniższy kod... w którym przed pomiarem odległości zatrzymuję silniki. Inaczej chyba się nie da... najwyżej że kiedyś uda się zdobyć jakież ultra ciche silniki lub ktoś mi podpowie co z tym fantem zrobić.

OPCJA A - wykrycie przeszkody

Prosty kod... wykrycie przeszkody, skręt w prawo i tak w kółko.

#include <Ultrasonic.h>
Ultrasonic ultrasonic( 6, 5 );
#include <AFMotor.h>
AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);

void setup()
{
  motor1.setSpeed(200);
  motor2.setSpeed(200);
  randomSeed(analogRead(0));
  Serial.begin( 9600 );
}
void loop()
{
  stac();
  Serial.print( ultrasonic.Ranging(CM) );
  Serial.println( "CM" );

  if (ultrasonic.Ranging(CM) < 20)
  {tyl(); prawo();}
 
  if (ultrasonic.Ranging(CM) > 20)
   {przod();}
 
}
   
    void przod(){
    motor1.run(FORWARD);
    motor2.run(FORWARD);
    delay(1000);}
 
    void tyl(){
    motor1.run(BACKWARD);
    motor2.run(BACKWARD);
    delay(1000);}
   
    void prawo(){
    motor1.run(FORWARD);
    motor2.run(BACKWARD);
    delay(750);}
   
    void stac(){
    motor1.run(RELEASE);
    motor2.run(RELEASE);}

OPCJA B - losowe wybranie kierunku jazdy

Jeżdżenie po prostym schemacie robi się po chwili nudne... prosto... przeszkoda... do tyłu ... w lewo... i od nowa. to może będzie jakąś opcją dodania losowości do kodu... jeżeli odległość będzie mniejsza od np 20 cm to ARDUINO wybiera losowo liczbę od jednego do 3 i odpowiednio wykonuje. Losowość dodaje trochę życia naszemu robocikowi... niemożliwość przewidzenia kolejnego ruchu wciąga... kilka wskazówek dostałem od właścicieli witryny trobot.pl... po wielu próbach ułożenia kodu w końcu chyba się udało... poniżej kod...

#include <Ultrasonic.h>
Ultrasonic ultrasonic( 6, 5 );
#include <AFMotor.h>
AF_DCMotor motor1(1, MOTOR12_1KHZ);
AF_DCMotor motor2(2, MOTOR12_1KHZ);
long randNumber;

void setup()
{
  motor1.setSpeed(200);
  motor2.setSpeed(200);
  randomSeed(analogRead(0));
  Serial.begin( 9600 );
}
void loop()
{
  stac ();
  Serial.print( ultrasonic.Ranging(CM) );
  Serial.println( "CM" );

  if (ultrasonic.Ranging(CM) < 20)
  {randNumber = random(1,4);
  Serial.print(randNumber);
  switch(randNumber){

  case 1:
  tyl(); prawo();
  Serial.print("A");
  break;

  case 2:
  tyl(); lewo();
  Serial.print("B");
  break;
 
  case 3:
  tyl(); zawrot();
  Serial.print("C");
  break;}}
 
  if (ultrasonic.Ranging(CM) > 20)
  {przod();}}

    void przod(){
    motor1.run(FORWARD);
    motor2.run(FORWARD);
    delay(1000);}
 
    void tyl(){
    motor1.run(BACKWARD);
    motor2.run(BACKWARD);
    delay(1000);}
  
    void prawo(){
    motor1.run(FORWARD);
    motor2.run(BACKWARD);
    delay(750);}
  
    void lewo(){
    motor1.run(BACKWARD);
    motor2.run(FORWARD);
    delay(750);}
  
    void zawrot(){
    motor1.run(BACKWARD);
    motor2.run(FORWARD);
    delay(1500);}
  
    void stac(){
    motor1.run(RELEASE);
    motor2.run(RELEASE);
    delay(20);}

w podglądzie wygląda że coś nie do końca działa... po wybraniu losowego numeru... i zadanej czynności... kolejny odczyt odległości jest nieprawidłowy... przez co robot wykonuje błędnie jedną sekundę do przodu. w ciasnym miejscu może o być problem... w większej przestrzeni może być niezauważalny...