SRC // REPOSITORIUM OPEN SOURCE

MEIN CODE & 3D-MODELLE

Vollständige Implementierungen, Steuerungs-Skripte für das ASTRO-CAR, KI-Katzenklappe und 3D-CAD-Modelle für den Raspberry Pi.

HARDWARE & SOFTWARE

ROBOTIK ARCHITEKTUR

Modulare Python-Module für H-Brücken, PWM-Servosteuerung und GPIO-Schnittstellen.

01. 3D-KONSTRUKTION & HARDWARE

ASTRO CAR KONSTRUKTION

Detaillierte Baugruppenübersicht und 3D-Modell des ferngesteuerten und autonom navigierenden Fahrzeugs.

3D MODELL VOM ASTRO CAR HERUNTERLADEN (PAINT 3D / .GLB) ⤓
BAUGRUPPE A

ASTRO CAR VON OBEN / UNTERBAU

ASTRO CAR von Oben
  1. 01
    4X Getriebemotor (DC 6V)
  2. 02
    5.000 mAh RC-Akku (Stromversorgung Antrieb)
  3. 03
    Motortreiber Typ „L298N-H-Brücke“
  4. 04
    Schalter (fürs Licht)
  5. 05
    Motortreiber Typ „L298N-H-Brücke“ (Sekundär)
  6. 06
    Ultraschallsensor (HC-SR04 Distanzmessung)
BAUGRUPPE B

ASTRO CAR VON UNTEN / OBERBAU

ASTRO CAR von Unten
  1. 01
    Raspberry Pi 4 Model B (Zentrale Steuereinheit)
  2. 02
    Servo-Motor (Ultraschall-Schwenkmechanismus)
  3. 03
    LED-Frontscheinwerfer (Licht)
  4. 04
    Schalter (fürs Licht)
02. QUELLTEXT-REPOSITORIUM

CODE ÜBERSICHT

Direkt nutzbare Python-Implementierungen mit GPIO-Ansteuerung, PWM-Regelung und Threading. Verbesserungsvorschläge gerne an: raspberrypiwebsite@gmail.com

01. Safe Lock 02. L298N H-Brücke 03. Tastatur-Steuerung 04. Autonome Fahrt 05. KI Katzenklappe
safe_lock.py • PWM & Passworteingabe
from gpiozero import LED, Button
import RPi.GPIO as GPIO
import threading
import getpass

# Pin-Nummerierung auf dem Board verwenden
GPIO.setmode(GPIO.BCM)

# Pin-Nummern definieren
pwm_gpio = 18
pwm_gpio1 = 21
frequency = 50

GPIO.setup(pwm_gpio, GPIO.OUT)
GPIO.setup(pwm_gpio1, GPIO.OUT)

pwm = GPIO.PWM(pwm_gpio, frequency)
pwm1 = GPIO.PWM(pwm_gpio1, frequency)

led = LED(17)
button = Button(16)

def angle_to_percent(angle):
    if angle > 180 or angle < 0:
        return False
    start = 4
    end = 12.5
    ratio = (end - start) / 180
    angle_as_percent = angle * ratio
    return start + angle_as_percent

def onButtonPressed():
    password = getpass.getpass("Bitte Passwort eingeben: ")
    if password == "123456789":
        zeit = int(input("Wie lange soll der Safe geöffnet bleiben? (in Sekunden): "))
        led.on()
        print("Button gedrückt, LED eingeschaltet")
        pwm1.start(angle_to_percent(90))
        threading.Timer(2, pwm.start, args=[angle_to_percent(180)]).start()
        threading.Timer(zeit, stop_lock).start()
    elif password == "easter_egg_123456789":
        led.on()
        print("Button gedrückt, LED eingeschaltet")
        pwm1.start(angle_to_percent(90))
        threading.Timer(2, pwm.start, args=[angle_to_percent(180)]).start()
        threading.Timer(0.5, blink_led, args=[3]).start()
    else:
        print("Falsches Passwort eingegeben")

def stop_lock():
    print("Safe Lock gestoppt")
    led.off()
    pwm.start(angle_to_percent(70))

def blink_led(num_blinks):
    for i in range(num_blinks):
        led.on()
        threading.Timer(0.5, led.off).start()

button.when_pressed = onButtonPressed

try:
    while True:
        pass
except KeyboardInterrupt:
    GPIO.cleanup()
L298NHBridge.py • Motortreiber Modul
import RPi.GPIO as io

io.setmode(io.BCM)
DC_MAX = 100
io.setwarnings(False)

ENA = 18
IN1 = 6
IN2 = 13
IN3 = 19
IN4 = 26
ENB = 12

leftmotor_in1_pin = IN1
leftmotor_in2_pin = IN2
io.setup(leftmotor_in1_pin, io.OUT)
io.setup(leftmotor_in2_pin, io.OUT)

rightmotor_in1_pin = IN3
rightmotor_in2_pin = IN4
io.setup(rightmotor_in1_pin, io.OUT)
io.setup(rightmotor_in2_pin, io.OUT)

io.output(leftmotor_in1_pin, False)
io.output(leftmotor_in2_pin, False)
io.output(rightmotor_in1_pin, False)
io.output(rightmotor_in2_pin, False)

leftmotorpwm_pin = ENA
rightmotorpwm_pin = ENB
io.setup(leftmotorpwm_pin, io.OUT)
io.setup(rightmotorpwm_pin, io.OUT)

leftmotorpwm = io.PWM(leftmotorpwm_pin, 100)
rightmotorpwm = io.PWM(rightmotorpwm_pin, 100)

leftmotorpwm.start(0)
leftmotorpwm.ChangeDutyCycle(0)
rightmotorpwm.start(0)
rightmotorpwm.ChangeDutyCycle(0)

def setMotorMode(motor, mode):
    if motor == "leftmotor":
        if mode == "reverse":
            io.output(leftmotor_in1_pin, True)
            io.output(leftmotor_in2_pin, False)
        elif mode == "forward":
            io.output(leftmotor_in1_pin, False)
            io.output(leftmotor_in2_pin, True)
        else:
            io.output(leftmotor_in1_pin, False)
            io.output(leftmotor_in2_pin, False)
    elif motor == "rightmotor":
        if mode == "reverse":
            io.output(rightmotor_in1_pin, False)
            io.output(rightmotor_in2_pin, True)
        elif mode == "forward":
            io.output(rightmotor_in1_pin, True)
            io.output(rightmotor_in2_pin, False)
        else:
            io.output(rightmotor_in1_pin, False)
            io.output(rightmotor_in2_pin, False)
    else:
        io.output(leftmotor_in1_pin, False)
        io.output(leftmotor_in2_pin, False)
        io.output(rightmotor_in1_pin, False)
        io.output(rightmotor_in2_pin, False)

def setMotorLeft(power):
    int(power)
    if power < 0:
        setMotorMode("leftmotor", "reverse")
        pwm = -int(DC_MAX * power)
        if pwm > DC_MAX:
            pwm = DC_MAX
    elif power > 0:
        setMotorMode("leftmotor", "forward")
        pwm = int(DC_MAX * power)
        if pwm > DC_MAX:
            pwm = DC_MAX
    else:
        setMotorMode("leftmotor", "stopp")
        pwm = 0
    leftmotorpwm.ChangeDutyCycle(pwm)

def setMotorRight(power):
    int(power)
    if power < 0:
        setMotorMode("rightmotor", "reverse")
        pwm = -int(DC_MAX * power)
        if pwm > DC_MAX:
            pwm = DC_MAX
    elif power > 0:
        setMotorMode("rightmotor", "forward")
        pwm = int(DC_MAX * power)
        if pwm > DC_MAX:
            pwm = DC_MAX
    else:
        setMotorMode("rightmotor", "stopp")
        pwm = 0
    rightmotorpwm.ChangeDutyCycle(pwm)

def exit():
    io.output(leftmotor_in1_pin, False)
    io.output(leftmotor_in2_pin, False)
    io.output(rightmotor_in1_pin, False)
    io.output(rightmotor_in2_pin, False)
    io.cleanup()
steuerung.py • Interaktive Tastatur-Steuerung
import sys, tty, termios, os, readchar
import L298NHBridge as HBridge

speedleft = 0
speedright = 0

print("w/s: beschleunigen")
print("a/d: lenken")
print("q: stoppt die Motoren")
print("x: Programm beenden")

def getch():
    ch = readchar.readchar()
    return ch

def printscreen():
    os.system('clear')
    print("w/s: vorwaerts / rueckwaerts beschleunigen")
    print("a/d: links / rechts lenken")
    print("q:   stoppt die Motoren")
    print("x:   Programm beenden")
    print("========== Geschwindigkeitsanzeige ==========")
    print("Geschwindigkeit linker Motor:  ", speedleft)
    print("Geschwindigkeit rechter Motor: ", speedright)

while True:
    char = getch()
    if(char == "w"):
        speedleft = speedleft + 0.5
        speedright = speedright + 0.5
        if speedleft > 1:
            speedleft = 1
        if speedright > 1:
            speedright = 1
        HBridge.setMotorLeft(speedleft)
        HBridge.setMotorRight(speedright)
        printscreen()
    if(char == "s"):
        speedleft = speedleft - 0.5
        speedright = speedright - 0.5
        if speedleft < -1:
            speedleft = -1
        if speedright < -1:
            speedright = -1
        HBridge.setMotorLeft(speedleft)
        HBridge.setMotorRight(speedright)
        printscreen()
    if(char == "q"):
        speedleft = 0
        speedright = 0
        HBridge.setMotorLeft(speedleft)
        HBridge.setMotorRight(speedright)
        printscreen()
    if(char == "d"):
        speedright = speedright + 0.5
        speedleft = speedleft - 0.5
        if speedright < -1:
            speedright = -1
        if speedleft > 1:
            speedleft = 1
        HBridge.setMotorLeft(speedleft)
        HBridge.setMotorRight(speedright)
        printscreen()
    if(char == "a"):
        speedleft = speedleft + 0.5
        speedright = speedright - 0.5
        if speedleft < -1:
            speedleft = -1
        if speedright > 1:
            speedright = 1
        HBridge.setMotorLeft(speedleft)
        HBridge.setMotorRight(speedright)
        printscreen()
    if(char == "x"):
        HBridge.setMotorLeft(0)
        HBridge.setMotorRight(0)
        HBridge.exit()
        print("Programm Ende")
        break
    char = ""
autonome_fahrt.py • Sonar-Hinderniserkennung
import RPi.GPIO as GPIO
import time
import sys, tty, termios, os, readchar
import L298NHBridge as HBridge

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

trigPin = 22
echoPin = 24
pwm_gpio = 25
frequence = 50
MAX_DISTANCE = 600
timeOut = MAX_DISTANCE * 60

GPIO.setup(pwm_gpio, GPIO.OUT)
pwm = GPIO.PWM(pwm_gpio, frequence)

speedleft = 0
speedright = 0

def angle_to_percent(angle):
    if angle > 180 or angle < 0:
        return False
    start = 4
    end = 12.5
    ratio = (end - start) / 180
    angle_as_percent = angle * ratio
    return start + angle_as_percent

def pulseIn(pin, level, timeOut):
    t0 = time.time()
    while(GPIO.input(pin) != level):
        if((time.time() - t0) > timeOut * 0.000001):
            return 0
    t0 = time.time()
    while(GPIO.input(pin) == level):
        if((time.time() - t0) > timeOut * 0.000001):
            return 0
    pulseTime = (time.time() - t0) * 1000000
    return pulseTime

def getSonar():
    GPIO.output(trigPin, GPIO.HIGH)
    time.sleep(0.00001)
    GPIO.output(trigPin, GPIO.LOW)
    pingTime = pulseIn(echoPin, GPIO.HIGH, timeOut)
    distance = pingTime * 340.0 / 2.0 / 10000.0
    return distance

def getSonar1():
    GPIO.output(trigPin, GPIO.HIGH)
    time.sleep(0.00001)
    GPIO.output(trigPin, GPIO.LOW)
    pingTime = pulseIn(echoPin, GPIO.HIGH, timeOut)
    distance1 = pingTime * 340.0 / 2.0 / 10000.0
    return distance1

def getSonar2():
    GPIO.output(trigPin, GPIO.HIGH)
    time.sleep(0.00001)
    GPIO.output(trigPin, GPIO.LOW)
    pingTime = pulseIn(echoPin, GPIO.HIGH, timeOut)
    distance2 = pingTime * 340.0 / 2.0 / 10000.0
    return distance2

def setup():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(trigPin, GPIO.OUT)
    GPIO.setup(echoPin, GPIO.IN)

def getch():
    ch = readchar.readchar()
    return ch

def printscreen():
    os.system('clear')
    print("w/s: vorwaerts / rueckwaerts beschleunigen")
    print("a/d: links / rechts lenken")
    print("q:   stoppt die Motoren")
    print("x:   Programm beenden")
    print("========== Geschwindigkeitsanzeige ==========")
    print("Geschwindigkeit linker Motor:  ", speedleft)
    print("Geschwindigkeit rechter Motor: ", speedright)

def strate_servo():
    pwm.start(angle_to_percent(90))

def Right_servo():
    pwm.start(angle_to_percent(180))

def Left_servo():
    pwm.start(angle_to_percent(10))

def strate():
    distance = getSonar()
    print("The distance of strate is : %.2f cm" % (distance))
    if distance <= 29:
        ende()
        check()

def Right():
    distance1 = getSonar1()
    print("The distance of right is : %.2f cm" % (distance1))

def Left():
    distance2 = getSonar2()
    print("The distance of left is : %.2f cm" % (distance2))

def forward():
    speedleft = 0.2
    speedright = 0.5
    if speedleft > 0.2:
        speedleft = 0.2
    if speedright > 0.5:
        speedright = 0.5
    HBridge.setMotorLeft(speedleft)
    HBridge.setMotorRight(speedright)
    printscreen()

def backward():
    speedleft = -1
    speedright = -1
    if speedleft < -1:
        speedleft = -1
    if speedright < -1:
        speedright = -1
    HBridge.setMotorLeft(speedleft)
    HBridge.setMotorRight(speedright)
    printscreen()

def rightr():
    speedright = +1
    speedleft = -1
    if speedright < -1:
        speedright = -1
    if speedleft > 1:
        speedleft = 1
    HBridge.setMotorLeft(speedleft)
    HBridge.setMotorRight(speedright)
    printscreen()

def leftl():
    speedleft = +1
    speedright = -1
    if speedleft < -1:
        speedleft = -1
    if speedright > 1:
        speedright = 1
    HBridge.setMotorLeft(speedleft)
    HBridge.setMotorRight(speedright)
    printscreen()

def check():
    distance1 = getSonar1()
    distance2 = getSonar2()
    Right_servo()
    Right()
    time.sleep(0.5)
    Left_servo()
    time.sleep(1.5)
    Left()
    time.sleep(0.1)
    strate_servo()
    if distance1 or distance2 < 10:
        backward()
    if distance1 < distance2:
        leftl()
        time.sleep(1)
        strate()
        loop()
    if distance1 > distance2:
        rightr()
        time.sleep(1)
        strate()
        loop()

def ende():
    speedleft = 0
    speedright = 0
    HBridge.setMotorLeft(speedleft)
    HBridge.setMotorRight(speedright)
    printscreen()

def loop():
    distance = getSonar()
    forward()
    strate_servo()
    while distance > 30:
        strate()

if __name__ == '__main__':
    print('Program is starting...')
    setup()
    try:
        loop()
    except KeyboardInterrupt:
        GPIO.cleanup()
        speedleft = 0
        speedright = 0
        HBridge.setMotorLeft(speedleft)
        HBridge.setMotorRight(speedright)
        printscreen()
03. EDGE-AI DOWNLOAD-PAKET

KI KATZENKLAPPE: DATEIEN & VIDEOS

Kompiliertes TensorFlow Lite Modell, EdgeTPU-Beschleunigerdatei, Python-Detektionsskripte und das vollständige bootfähige Betriebssystem-Image.

cat_detection.tflite ⤓ cat_detection_edgetpu.tflite ⤓ ALLE DATEIEN AUF GITHUB ↗ RASPBERRY PI-IMAGE DOWNLOAD (GOOGLE DRIVE) ↗
Katzenklappe mit Gesichtserkennung (Longversion) TFLITE
Katzenklappe Prototyp & Test TENSORFLOW
Raspberry Pi Projekt Teil 20 UPDATE