Rover

Beschreibung:

Ziel des Projektes ist es, dass der Rover mittels einer HTML Seite gesteuert wird. Der Rover besteht aus zwei Raupenantrieben, die jeweils von zwei Motoren betrieben werden. Die Motoren werden über Ausgänge des Raspberry Pis angesprochen. Die Stromversorgung ist über PowerBanks/Akkus realisiert, die sowohl den Raspberry Pi als auch die Motoren mit Energie versorgen. Mit einer Kamera kann man während der Fahrt oder im Stillstand die Umgebung betrachten. Diese ist über Servos horizontal und vertikal in ihrer Position verstellbar.

Aufbau:

Software:

Die Skripte wurden in Phyton und HTML geschrieben. Damit dieses Projekt realisierbar ist, ist es notwendig Pakete auf den Raspberry Pi zu installieren. Der Zugriff während der Programmier Phase erfolgt über Putty (SSH, Terminal) oder alternativ über VPN (grafische Oberfläche). Beide Möglichkeiten müssen in der Konfigurationsdatei des Raspberry Pis aktiviert werden.

Eingesetzte Software

⦁ Python

⦁ Kamera (Motion)

⦁ VNC (um extern mit einem PC eine Verbindung aufzubauen)

⦁ Flask Server für Kommunikation (Bewegung des Rovers)

Als nächsten Schritt stellt man die Kamera Optionen richtig ein. Dazu öffnet man die config Datei der Kamera und stellt folgende Parameter ein.

⦁ daemon = on

⦁ framerate = 90

⦁ stream maxrate = 100

⦁ stream localhost off

Bauteile:

⦁ Raspberry Pi

⦁ Rover Kit mit Motoren

⦁ Servo für die Kamera

⦁ Raspberry Pi Kamera

⦁ Brett um Hardware zu montieren

⦁ Power Bank für Spannungsversorgung

⦁ Power Bank

Beschreibung des Codes:

Über die eingefügten Bilder auf der HTML Seite, die einen Link hinterlegt haben, sendet der Flask Server mit der Methode POST den Befehl an den Raspberry Pi. Dieser schaltet darauf hin den entsprechenden Motor an oder aus. Das gleiche gilt für die Servos. Die Kamera läuft im Hintergrund und der Livestream kann mittels Browser betrachtet werden.

Erweiterungsmöglichkeiten:

Man könnte einen Ultraschall Sensor montieren der dann die Entfernung zu einem Objekt misst. Der Rover könnte dann auf dieses Hinderniss reagieren und selbstständig stoppen.

Code-Ausschnitte:

HauptGui.py
**Ansteuerung des Motors / Servos**
 
import RPi.GPIO as GPIO
from time import sleep
 
GPIO.setmode(GPIO.BOARD)	#GPIO-Belegung auf die des Shields stellen
#Alle GPIO PINS als Ausgang
GPIO.setup (31, GPIO.OUT)	#Beide angeschlossenen GPIOs als Ausgang deklarieren
GPIO.setup (33, GPIO.OUT)
GPIO.setup (35, GPIO.OUT)	#Beide angeschlossenen GPIOs als Ausgang deklarieren
GPIO.setup (37, GPIO.OUT)
 
 
 
def Servo1hoch():
    GPIO.setmode(GPIO.BOARD)	#GPIO-Belegung auf die des Shields stellen
    GPIO.setup (22, GPIO.OUT) #Servo 1 als Ausgang
    Servo1 = GPIO.PWM (22, 50)     #GPIO 11 als PWM mit 50Hz
    Servo1.start(2.5)              #Initialisierung
    Servo1.ChangeDutyCycle(2.5)
    sleep(1)
    print("Servo ist oben")
    sleep(1)
    Servo1.stop()
 
 
 
 
def forward():
 
 
    GPIO.output(31, GPIO.HIGH)		#Die GPIOs umgekehrt schalten, Drehrichtung wird invertiert 
    GPIO.output(33, GPIO.LOW)		#Wichtig: Erst den Aktiven GPIO auf "low" stellen!
    GPIO.output(35, GPIO.HIGH)		#Den Motor starten, indem ein GPIO Strom ausgibt, der andere nicht.
    GPIO.output(37, GPIO.LOW)
    sleep(1)
    print("motor dreht vorwaerts")
    GPIO.output(31, GPIO.LOW)		#GPIOs stromlos schalten
    GPIO.output(33, GPIO.LOW)
    GPIO.output(35, GPIO.LOW)		#GPIOs stromlos schalten
    GPIO.output(37, GPIO.LOW)
 
 
 
 
**Aufsetzen des Flask Servers und Weiterleitung der Steuerbefehle **
 
from flask import Flask, render_template, request, redirect, url_for, make_response
import motors
import RPi.GPIO as GPIO
 
GPIO.setmode(GPIO.BOARD) #Einstellen auf die GPIO Pin Belegung des Boards
 
 
 
app = Flask(__name__) #Aufsetzen des Flask Servers
 
@app.route('/') #Wenn die Home IP eingegeben wird, wird index.html aufgerufen
def index():
 
	return render_template('index.html')
 
#Beim Betaetigen eines Buttons wird der Pin mit Post uebergeben und hier im Python Code der jeweiligen Motor Funktion uebergeben
 
@app.route('/<changepin>', methods=['POST'])
 
def reroute(changepin):
 
	changePin = int(changepin) #cast changepin to an int
 
	if changePin == 1:
	     motors.turnLeft()
 
 
 
 
**HTML Ausschnitt (Bei betätigung des Buttons sendet er den Pin 1**
 
<!DOCTYPE html>
<html>
 
	<head>
		<title>Roboter mit Kamera</title>
		<meta name="viewport" content="width=device-width, initial-scale=1">
	</head>
 
<style>
table ,td, tr {
		width: 30%;
}
 
</style>
 
	<body>
		<h1>Ferngesteuerter Robtoter mit Kamera</h1>
 
 
 
		<table style="width:15%;" >
			<h2>Rover Bewegungssteuerung</h2>
 
			<tr>
				<td>
					<form action="/1" method="POST">
						<input type="image" name="direction" src="/static/img/Links.svg" value="Links" style="float:left; width:60% ;">
						</br>
					</form>
				</td>