IDCT Bartosz Pachołek

Uwaga: Ciasteczka!

Ta witryna korzysta z cookies: Informujemy, że ta witryna korzysta z własnych, technicznych oraz należących do podmiotów zewnętrznych ciasteczek ("cookies") celem śledzenia aktywności oraz zapewnienia pełnej funkcjonalności. Kontynuując akceptujesz użycie cookies. Aby korzystać z pewnych części witryny konieczna jest akceptacja.

Pierwsza sztuczka robota na Raspberry Pi

Opublikowano 2020-01-16

O samym robocie napiszę więcej wkrótce. Chwilowo na szybko: zdjęcia, prowizoryczny kod programu oraz filmik z pierwszej sztuczki.

Sztuczka

  • Jedź do przodu aż do przeszkody
  • Jedź do tyłu aż do przeszkody
  • Spróbuj stanąć mniej więcej na środku pomiędzy przeszkodami

Kod

#include <stdio.h>
#include <wiringPi.h>
#include <unistd.h>
#include <ncurses.h>
#include <termios.h>

//definicja pinow GPIO
#define L_R 19
#define R_R 13
#define L_F 20
#define R_F 26
#define B_TRIG 5
#define B_TECHO 12
#define F_TRIG 21
#define F_TECHO 16
//#define BTRIG 6
//#define BECHO 12

/**
 * uwaga: procedura jest BLOKUJĄCA!
 * procedura pomiaru odległości
 */
static float ping( int trig, int echo )
{
    int start = micros();
    long ping = 0;
    long pong = 0;
    float distance = 0;
    long timeout = 100000; // 0.5 sec ~ 171 m

    // Reset triggera (stan 0)
    digitalWrite(trig, LOW);
    delay(50);

    // Odpalenie triggera
    digitalWrite(trig, HIGH);
    delayMicroseconds(10);
    digitalWrite(trig, LOW);
    while (digitalRead(echo) == LOW && micros() - start < timeout)
    {
    }

    if (micros() - start > timeout)
    {
        return 9999;
    }

    ping = micros() - start;

    while (digitalRead(echo) == HIGH && micros() - start < timeout)
    {
    }

    if (micros() - start > timeout)
    {
        return 9999;
    }

    pong = micros() - start;

    // zamiana pinga na odleglosc
    distance = (float)(pong - ping) * 0.017150;
    return distance;
}

static void stop()
{
    digitalWrite(L_F, 0);
    digitalWrite(L_R, 0);
    digitalWrite(R_R, 0);
    digitalWrite(R_F, 0);
}

static void moveForward()
{
    digitalWrite(L_F, 0);
    digitalWrite(R_F, 0);
    digitalWrite(R_R, 1);
    digitalWrite(L_R, 1);
}
static void moveBack()
{
    digitalWrite(L_F, 1);
    digitalWrite(R_F, 1);
    digitalWrite(R_R, 0);
    digitalWrite(L_R, 0);
}

static void rotateLeft()
{
    digitalWrite(R_F, 0);
    digitalWrite(L_F, 1);
    digitalWrite(R_R, 1);
    digitalWrite(L_R, 0);
}

static void rotateRight()
{
    digitalWrite(R_F, 1);
    digitalWrite(L_F, 0);
    digitalWrite(R_R, 0);
    digitalWrite(L_R, 1);
}

int main(void)
{
    int i;
    /* ustawiamy konsole w tryb nieblokujacy */
    initscr();
    cbreak();
    noecho();
    scrollok(stdscr, TRUE);
    nodelay(stdscr, TRUE);

    printf("Starting\n");
    wiringPiSetupGpio();
    pinMode(L_R, OUTPUT);
    pinMode(R_R, OUTPUT);
    pinMode(L_F, OUTPUT);
    pinMode(R_F, OUTPUT);
    pinMode(F_TRIG, OUTPUT);
    pinMode(F_TECHO, INPUT);
    pinMode(B_TRIG, OUTPUT);
    pinMode(B_TECHO, INPUT);
    int pingval_front = 1000;
    int pingval_back = 1000;

    //going forward
    moveForward();
    int hittime, backtime, total, traveltime;
    while ( ping (F_TRIG, F_TECHO) > 8 ) { } //going forward until less than 8cm
    hittime = micros(); //hit time
    moveBack();
    while ( ping (B_TRIG, B_TECHO) > 8 ) { } //going backwards until less than 8cm
    backtime = micros();
    total = backtime - hittime;
    traveltime = total / 2; //we want to travel that long
    moveForward();
    while ( micros() - backtime < traveltime ) {}
    stop();
    return 0;
}

Kompilacja

gcc -Wall -o run run.c -lwiringPi -lncurses

Wideo

Uwaga: treść pod tym polem jest niedostępna przy obecnych ustawieniach cookies, gdyż wymaga zgody na wyświetlanie treści z YouTube. Jeśli chcesz zmienić swoje ustawienia odnośnie cookies może to możesz je zresetować klikając na poniższy przycisk:

wyczyść ustawienia cookies

Zdjęcia robota

Robot 1 Robot 2 Robot 3

Podsumowanie

Więcej informacji wkrótce, dodam też schemat połączeń.

Muszę tez popracować nad mocowaniem gąsienic, gdyż lekko ucieka w jedną stronę.