RC-Car mittels Smartphone steuern

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

Hallo miteinander,

Ich habe als Diplomarbeit ein RC-Car mittels Smartphone als Steuerung ausgewählt. Ich benutze als Antriebsmotor einen DC-Motor und für die Lenkung verwende ich einen ServoMotor.

Meine Frage ist nun. ich kann die SensorenWerte vom Smartphone schon im Python empfangen. Nur weis ich nicht genau wie ich diese Werte in meinem Python programm in den Methoden weiter verwenden kann.

Ziel ist es die Werte als einen ganzen String zu schicken, und im Python dann mittels split für die einzelnen Methoden(Motoren) aufzuteilen.

Ich hoffe es kann mir jemand helfen, oder hat sogar schon mal das gleiche Programm/Projekt gehabt.

MFG Crisou
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da fehlen eine Menge Informationen. Wie sieht der String aus. Womit soll die Ansteuerung der Motoren und des servos erfolgen. Welchen Code hast du schon.
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

naja bin grad dabei den ganzen code zu erstellen.

hab zuerst damit angefangen die motoren über tastatureingabe zu steuern.

Die sterueng des antriebs sollte über ein Schieberegler und über Buttons(vor und zurück) erfolgen.
Die Lenkung des servo Motors über die Bewegungssensoren des Smartphones.

import socket

class Server():
def StartServer():
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
connection.bind(('10.68.68.238', 8888))
connection.listen(10)
while True:
current_connection, address = connection.accept()
while True:
data = current_connection.recv(2048)
print (data)
if data == 'quit\r\n':
current_connection.shutdwon(1)
current_connection.close()

elif data == 'stop\r\n':
current_connection.shutdwon(1)
current_connection.close()
exit()
def link():
or data in data_Array:
if data == "":
print (data)
continue
if cmd.CMD_TURN_LEFT[1:] in data:
mdev.servoMotor(Servo_Pin, Data)
elif cmd.CMD_TURN_RIGHT[1:] in data:
mdev.servoMotor(Servo_Pin, data)
elif cmd.CMD_TURN_CENTER [1:] in data:
mdev.servoMotor(Servo_Pin, Data)

if __name__ == "__main__":
try:
Server.StartServer()
except KeyboardInterrupt:

so habe ich mir das vorgestellt für die Lenkung (links,rechts)

Habe 2 eigene Klassen für die kommandos und GPIO deklarierung.

Ich glaube ich liege da vollkommen falsch oder?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte Code Tags aus dem vollständigen Editor benutzen. So ist dein Code komplett unlesbar, da die Einrückungen verschwunden sind.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Crisou: der Code hat SyntaxFehler und viele Rechtschreibfehler. Programmierer müssen gewissenhaft arbeiten (wie eigentlich überall). Eine Klasse für eine einzelne Methode ist Quatsch, das ist eine Funktion. Benutze nicht low-level-Sockets. So wie Du sie programmiert hast, ist es falsch und es ist müßig, das selbst machen zu wollen, da man viele Fallstricke umschiffen muß. Benutze ein bereits vorhandenes Protokoll und sei es Telnet.

`exit` sollte in einem normalen Programm nicht vorkommen (wird auch gar nicht importiert), ein Programm sollte natürlicherweise an sein Ende kommen, indem man die Funktion einfach verläßt (hier break).
`link` hat keinen Link zum Rest des Programms.
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

Vielen dank für die Informationen.

Ich muss sagen das ich im Python programmieren sehr low bin.
Also so gesagt ein noob.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dagegen gibt es Tutorials und natürlich auch hier Hilfestellung. Aber weder liefern wir dir fertigen Code, noch lässt sich aus dem, was du bisher präsentiert hast, konkrete Hilfestellung ableiten. Sowohl das Formatieren von Code als auch die Darstellung der über den Socket verschickten Daten haben nichts mit Noob sein zu tun. Auch das du nicht erzählst welche Hardware du konkret verwendest etc. Das ist alles erfragt worden, aber hat keine Antwort von dir erfahren.

Irgendwie irgendein Auto ansteuern kann man mit irgendwelchem Code ganz bestimmt 🤷🏼‍♀️
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

Ja deets kann dich/euch verstehen.

Es ist mir auch klar das ihr hier keine fertigen Codes geben wird.

Aber habt ihr vielleicht links die mir weiter helfen könnten?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Seufz. Wozu denn links? Zu der Ansteuerung von Servos, von der wir nicht wissen, welche Hardware du hast? Zur Ansteuerung von den DC-Motoren, von denen wir nicht wissen, welche Hardware du hast? Zur Verarbeitung von Strings, deren Inhalt wir nicht kennen?

Python lernen kannst du hier: https://docs.python.org/3/tutorial/index.html
Zu deinen anderen Problemen kannst du hier gucken: http://www.google.de/

Um das nochmal ganz deutlich zu sagen: du hast bisher bei weitem nicht genug Informationen geliefert, mit denen konkretere Hilfestellung moeglich ist.
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

Ja ich verwende ein Fahrzeug von Cada Technik

Eingebaut wird ein Servo Motor(Arduino) sowie dc Motor(Arduino)

Angesteuert werden die Motoren von einem Raspberry Pi 3 b+

Außerdem werden am Fahrzeug eine raspi Cam und ein ultraschall sowie gps sensor angebracht.

Diese werden auch vom raspberr Pi angesteuert

Gesteuert werden sollen die Motoren von einer android App.

Cam, gps-Sensor und ultraschallsensor senden die werde auf die App zurück.

Die Lenkung erfolgt über die bewwegungssensoren vom smartphone. Die geschwindigkeit (Schieberegler) vor/zurück ( über Buttons) am Display des Smartphones soll ein Stream der Cam erfolgen.

Ultraschallsensor soll dafür sein, das wenn Fahrzeug Nähe wand kommt stehen bleibt und nicht mehr nach vorne gelenkt werden kann.

GPS Sensor sendet werte und diese werden dann für Geschwindigkeitsberechnung herangezogen und am Display vom Smartphone ausgegeben.

So ich hoffe ich hab jetzt alles

Mache das Projekt mit einem Kollegen zusammen.
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Schon besser. Aber noch lange nicht spezifisch genug.

Wenn du von Servo und DC Motoren sprichst, die (Arduino) sind - was heisst denn das? Machen die die eigentliche Motoransteuerung? Wenn ja, wie haengen die am PI? Das ist entscheidend fuer die Frage wie man die Steuerkommandos vom Netzwerk weiterverarbeitet.

Wie sehen die Daten aus, die der Pi bekommt?

Wie soll das Kamerabild in die App? Habt ihr da schon was fertiges?

Und eine Anmerkung zum schluss: regelungstechnisch ist es ganz wichtig, dass die US-Sensoren direkt die Motoren stoppen, wenn eine Kollision droht. Und NICHT einen Umweg ueber die App nehmen. Denn die ist mit einem unzuverlaessigen und langsamen Netzwerk (WIFI) verbunden, und da kommt es ggf. zu unvertretbaren Verzoegerungen.

Allgemein muss ich sagen: das ist SAUVIEL was ihr euch da vorgenommen habt. Und das ohne Programmierkenntnisse halte ich fuer nicht wirklich machbar. Fuer mein eigenes Projekt

https://github.com/deets/jetbot-3000

das ich mal aus Spass gemacht habe, habe ich die Videoverbindung mittels Skype gemacht. Mobiltelefon auf den Roboter, und dann einfach Skype aufmachen und eine Verbindung herstellen. Mit einem Smartphone ist das natuerlich nicht so einfach, weil da immer nur ein Programm gleichzeitig laeuft.
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

Also beide Motoren werden über die gpio Pins angeschlossen. Beide über einen pwm-fähigen Pin.

Also ich bekomm vom android Programm über dem docket einen String-Paket. Das die werde für den servo enthalten aber auch die Werte für den dc Motor.

Ne für die Kamera hab ich noch kein Skript geschrieben.
Die Arbeit ist in Etappen eingeteilt.

Ja ich weis das es echt eine Menge ist. Das große Ziel ist es wirklich mal die Steuerung das die funktioniert.

Und das die Sensoren funktionieren.

Zum us-Sensor. Das stopp erfolgt ja am raspi alles. Die App soll lediglich ein Kommando(stop) erhalten.
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

ich bekomme die Sensor Daten von der App über einen socket ermittelt.

Als erstes Mal die Werte für den servo Motor.

Meine Frage ist nun wie ich die Werte weiter verarbeite. Ich bekomme die Werte als Winkel angegeben. Von -45 bis 45.

Nun will ich diese ins tastverhältnis in % Prozent um zu wandeln. 7,5 = 0, 10 = 90, 5 = -90.

Kann aber noch geändert werden.

Es soll also sowie das Smartphone lenkt der servo in die Richtung lenken. Mit dem Einschlag.

Kann mir da vielleicht weiterhelfen, wie ich das in eine Methode implementiere.

Weiters wie es dann funktioniert wenn ich die Werte für den Antrieb bekomme.

Wie ich diese dann splitten kann.

Danke im vorraus
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe dich schon wiederholt darum gebeten, KONKRET den String zu zeigen, der bei dir über das Netzwerk kommt. Dem bist du bis jetzt nicht nachgekommen. Man kann also nichts dazu sagen, “wie es dann funktioniert wenn ich die Werte für den Antrieb bekomme. Wie ich diese dann splitten kann.” Weiß hier keiner.

Und die Umwandlung von Winkel in Tastverhältnis ist eine simple geradengleichung.

Winkel * Steigung + Achsenabschnitt = Tastverhältnis

Da kannst du deine Werte für Winkel und Variable einsetzen, und bestimmst die beiden Konstanten Steigung und achsenabschnitt.
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

ServerScript:

import socket
import Servo

Servo.setup()

def listen():
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conection.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
connection.bind(('IP_ADRESSE' Port))
connection.listen(10)
while True:
current_connection, address = connection.accept()
while True:
data = current_connection.recv(2048)
if not data:
break
if data == winkel:
Servo.ServoUp
if data == winkel:
Servo.ServoDown

if __name__== "__main__":
try:
listen()
except KeyboardInterrupt:
pass

Servo-Script

import Rpi.GPIO as GPIO

def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setwarnigs(False)
GPIO.setup(18, GPIO.OUT)
servo = GPIO.PWM(18, 50)
servo.start(7.5)
servo.ChangeDutyCycle(2.5)

def ServoUp(winkel)
if winkel <= 45:
pwm = winkel/18 + 2.5
servo.ChangeDutyCycle(pwm)
def ServoDown(winkel):
if winkel >= 45
pwm = winkel/18 - 2.5
servo.ChangeDutyCycle(pwm)

def close():
servo.stop()
if __name__=='__main__':
setup()

Ich weiß ich habe da bestimmt viele Fehler drin.

Mein Ziel ist es mit den Sensorwerten die ich im ServerSkript erhalte im servoSkript zu verwenden und dort ins Taktverhältnis umzuwandeln.
Im Serverskript sollen dann die Methoden für Links und Rechts wieder aufgerufen werden und dann dem Raspberry Pi übergeben werden
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Uuuuund schon wieder keine Code-Tags. Kann man so nix mit anfagen, weil Einrueckungen in Python nunmal wichtig sind.
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

import socket
import Servo

Servo.setup()

def listen():
connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conection.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
connection.bind(('IP_ADRESSE' Port))
connection.listen(10)
while True:
current_connection, address = connection.accept()
while True:
data = current_connection.recv(2048)
if not data:
break
if data == winkel:
Servo.ServoUp
if data == winkel:
Servo.ServoDown

if __name__== "__main__":
try:
listen()
except KeyboardInterrupt:
pass
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

ja sorry ist mir schon klar. sobald ich abschicke ist die einrückung wieder weg
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

Servo Skript

Code: Alles auswählen

import Rpi.GPIO as GPIO

def setup():
	GPIO.setmode(GPIO.BCM)
	GPIO.setwarnigs(False)
	GPIO.setup(18, GPIO.OUT)
	servo = GPIO.PWM(18, 50)
	servo.start(7.5)
	servo.ChangeDutyCycle(2.5)

def ServoUp(winkel):
	if winkel <= 45:
		pwm = winkel/18 + 2.5
		servo.ChangeDutyCycle(pwm)
def ServoDown(winkel):
	if winkel >= 45
		pwm = winkel/18 - 2.5
		servo.ChangeDutyCycle(pwm)

def close():
	servo.stop()
if __name__=='__main__':
	setup()[/code
Crisou
User
Beiträge: 23
Registriert: Samstag 20. Oktober 2018, 18:09

Server Script

Code: Alles auswählen

import socket
import Servo

Servo.setup()

def listen():
	connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	conection.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
	connection.bind(('IP_ADRESSE' Port))
	connection.listen(10)
	while True:
		current_connection, address = connection.accept()
		while True:
			data = current_connection.recv(2048)
			if not data:
				break
			if data == winkel:
				Servo.ServoUp
			if data == winkel:
				Servo.ServoDown

if __name__== "__main__":
	try:
		listen()
	except KeyboardInterrupt:
		pass
Antworten