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
RC-Car mittels Smartphone steuern
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?
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?
@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.
`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.
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
Irgendwie irgendein Auto ansteuern kann man mit irgendwelchem Code ganz bestimmt
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.
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.
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.
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.
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.
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.
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.
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.
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
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
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.
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.
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
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
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
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 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
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