Top

Microb

Ein weiterer Versuch verschiedene Bauteile mit einem Raspberry Pi zu kombinieren. Es sollte sich bewegen und den Abstand nach vorn messen können und mit einer LED Rückmeldung geben. Das Projekt besteht aus einem Hardware- und Software-Teil.

Hardware

  • Raspberry Pi Model B
  • Kamera Module
  • WLAN Adapter
  • HC-SR04 US Modul
  • L298N Controller
  • Zumo Chassis Kit
  • 5V DC Getriebemotoren
  • USB Powerbank

Man sollte erst einmal einen Testaufbau machen und dann anfangen die Teile zu verlöten.

Microb

Das Zumo Chassis Kit dient als Aufbau Basis.
Die Fortbewegung wird durch die Getriebemotoren und dem L298N Controller realisiert.
Das HC-SR04 US Modul wird mit der LED zusammen auf einer Platine verlötet.

MICROB RASPBERRY PI
Vcc Pin 2 – 5 V
GND Pin 6 – GROUND
LED Pin 7 – GPIO 4
Trig Pin 11 – GPIO 17
Echo Pin 12 – GPIO 18
IN1 Pin 13 – GPIO 21
IN2 Pin 15 – GPIO 22
IN3 Pin 16 – GPIO 23
IN4 Pin 18 – GPIO 24

An den L298N Controller werden die beiden Motoren angeschlossen, zudem werden GROUND vom Raspberry Pi und dem HC-SR04 Modul zusammen mit der Stromquelle angeschlossen.

Microb

Software

Eine einfache Python Klasse kann es nun ermöglichen, vorwärts und rückwärts zu fahren, sich links herum und rechts herum zu drehen, den Abstand nach vorn zu messen und die LED ein- und auszuschalten.

import time
import subprocess
import RPi.GPIO as GPIO

DISTANCE = 12

GPIO_LIGHT = 7
GPIO_TRIGGER = 11
GPIO_ECHO = 12
GPIO_IN1 = 13
GPIO_IN2 = 15
GPIO_IN3 = 16
GPIO_IN4 = 18

GPIO.setmode(GPIO.BOARD)

GPIO.setup(GPIO_LIGHT, GPIO.OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)
GPIO.setup(GPIO_IN1, GPIO.OUT)
GPIO.setup(GPIO_IN2, GPIO.OUT)
GPIO.setup(GPIO_IN3, GPIO.OUT)
GPIO.setup(GPIO_IN4, GPIO.OUT)

class Robot(object):
    def __init__(self):
        self.distance = 'start'
        self.video_stream_pid = False
        self.moves = []

    def get_moves(self):
        return self.moves

    def reset_moves(self):
        self.moves = []

    def set_move(self, move):
        self.moves.append(move)

    def switch_light():
        if GPIO.input(GPIO_LIGHT):
            GPIO.output(GPIO_LIGHT, False)
        else:
            GPIO.output(GPIO_LIGHT, True)

    def take_picture(self, static='robottest.jpg'):
        cmd = 'raspistill --nopreview -w 1024 -h 768 -t 1 -o ' + static
        self.video_stream_pid = subprocess.call(cmd, shell=True)
        print(self.video_stream_pid)

    def get_current_distance(self):
        return self.distance

    def get_distance(self):
        GPIO.output(GPIO_TRIGGER, True)
        time.sleep(0.00001)
        GPIO.output(GPIO_TRIGGER, False)
        start_time = time.time()
        while GPIO.input(GPIO_ECHO) == 0:
            start_time = time.time()
        while GPIO.input(GPIO_ECHO) == 1:
            end_time = time.time()
        delta_time = end_time - start_time
        self.distance = (delta_time * 34300) / 2
        return self.distance

    def turn_right(self):
        GPIO.output(GPIO_IN2, GPIO.HIGH)
        GPIO.output(GPIO_IN3, GPIO.HIGH)

    def turn_left(self):
        GPIO.output(GPIO_IN1, GPIO.HIGH)
        GPIO.output(GPIO_IN4, GPIO.HIGH)

    def forward(self):
        GPIO.output(GPIO_IN1, GPIO.HIGH)
        GPIO.output(GPIO_IN3, GPIO.HIGH)

    def reverse(self):
        GPIO.output(GPIO_IN2, GPIO.HIGH)
        GPIO.output(GPIO_IN4, GPIO.HIGH)

    def stop(self):
        GPIO.output(GPIO_IN1, GPIO.LOW)
        GPIO.output(GPIO_IN3, GPIO.LOW)
        GPIO.output(GPIO_IN2, GPIO.LOW)
        GPIO.output(GPIO_IN4, GPIO.LOW)

Zusätzlich zu der Klasse um die GPIO Pins zu nutzen, existiert eine Flask Applikation.
Diese stellt ein Webinterface zu Verfügung um mit Microb zu interagieren.

Microb

Jede Bewegung erzeugt einen Datensatz dieser wird in einer Liste hinzugefügt.
Damit können Bewegungsabläufe in umgedrehter Reihenfolge ausgeführt werden.
Zudem ist es möglich Bewegungsabläufe aufzunehmen, zu speichern und ablaufen zu lassen.

{
    "forward": 0, 
    "reverse": 0, 
    "left": 0, 
    "right": 0,
    "length": 0, 
    "distance": 0, 
    "image": ""
}