Projects Voiture télécommandé depuis serveur web

Vous souhaitez développer un projet mais vous manquez de temps, de compétences ? Présentez votre projet ici pour trouver des participants...

Modérateur : Francois

Répondre
john7864
Messages : 13
Enregistré le : ven. 1 nov. 2019 15:41

Projects Voiture télécommandé depuis serveur web

Message par john7864 » ven. 1 nov. 2019 16:08

Bonjour,

Je souhaite réaliser une voiture commandée équipé d'un rpi3b+ commandé par un serveur web, je ne connais pas grand-chose en programmation hélas.
Le châssis de la voiture est celui-là :
Image


Pour le train avant il est dirigé par un servomoteur 5 v, J'arrive à le diriger avec servoblaster jusque-là tout va bien.
En ce qui concerne le serveur web je galère, je ne connais pas la bonne marche à suivre le quelle choisir ?
Existe-t-il des modèles de télécommande pré-configurer pour mon modèle de châssis ?
Les tuto sur le net sont malheureusement en général incomplets ou pour un modèle de châssis en H qui ne me correspond pas.

Merci pour votre aide

Bud Spencer
Raspinaute
Messages : 630
Enregistré le : lun. 15 août 2016 21:38

Re: Projects Voiture télécommandé depuis serveur web

Message par Bud Spencer » sam. 2 nov. 2019 11:41

john7864 a écrit :
ven. 1 nov. 2019 16:08
En ce qui concerne le serveur web je galère, je ne connais pas la bonne marche à suivre le quelle choisir ?
Techniquement, tout est la -> viewtopic.php?f=44&t=3033
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

john7864
Messages : 13
Enregistré le : ven. 1 nov. 2019 15:41

Re: Projects Voiture télécommandé depuis serveur web

Message par john7864 » sam. 2 nov. 2019 13:20

Effectivement hier soir j'ai passé ma soirée à le lire, 3 années de tuto merci à toi c'est un tuto de dingue. :o :o
la création du serveur avec le tuto je devrais pouvoir me débrouiller Côté servomoteur la je comprends rien. j'ai besoin des fichiers .cgi et la je ne suis pas capable de l'écrire, est-ce qu'il existe un modèle ou j'aurais juste à indiquer les pins à utilisés sur mon gpio ?
Pour pouvoir de dirigé les roues de gauche a droite.

Bud Spencer
Raspinaute
Messages : 630
Enregistré le : lun. 15 août 2016 21:38

Re: Projects Voiture télécommandé depuis serveur web

Message par Bud Spencer » sam. 2 nov. 2019 22:26

Si tu veux faire du temps reel depuis un navigateur, le seul moyen, c’est d’utiliser des web socket. Le tuto met en œuvre Socket.IO avec NodeJs et c’est plutôt simple à aborder (comparer aux autres technologies). Pour les servo-moteure, je n’en utilise pas, mais si matériellement ça peut se piloter avec un PI, alors ça peut forcement se piloter avec NodeJS.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

john7864
Messages : 13
Enregistré le : ven. 1 nov. 2019 15:41

Re: Projects Voiture télécommandé depuis serveur web

Message par john7864 » mar. 5 nov. 2019 18:03

Oui le bidirectionnelle MERCI encore pour ton aide. Côté serveur sa fonctionne maintenant :D :D :D :D :D Maintenant c'est parti pour diriger le servomoteur depuis le web.Je m'inspire d'un tuto où les lignes de commande pour le servomoteur on l'air de correspondre à mon besoin, il augmente ou diminue la valeur de 2 en fonction du bouton utilisé gauche droit. Voici le lien et merci a l'auteur au passage https://jmdefais.pagesperso-orange.fr/t ... bot_pi.htm .
J'ai bien réussi a installer la 'page web avec les boutons de commande.
Par-contre niveau codage c'est la galère voici le code que j’exécute et en erreur j'obtiens :

pi@raspberrypi:~ $ python robot2.py
Traceback (most recent call last):
File "robot2.py", line 4, in <module>
import web
ImportError: No module named web

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import web
import spidev
import RPi.GPIO as GPIO
from RPIO import PWM
from web import form
import threading
# definit GPIO en sortie
GPIO.setmode(GPIO.BCM)
PWM.setup()
PWM.init_channel(0)

pins = [17,18,22,24,25,27,4]

for pin in pins:

GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)


vitmotd = GPIO.PWM(4,500)
vitmotg = GPIO.PWM(27,500)
vset = 30

horizontal=150
vertical=150

GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

def StopEvent(pin):
print("Detection obstacle")
vitmotd.stop()
vitmotg.stop()
GPIO.output(25,0)
GPIO.output(24,0)
Volt()

def Volt():

spiDevice = spidev.SpiDev()
channel = 0
spiDevice.open(0,0)
values = spiDevice.xfer2([1,(8+channel)<<4,0])
index = ((values[1]&3) << 8) + values[2]
print "Tension =", round(index*(13.2/1023),2),"V"
if index < 700 :

print "Batterie faible"
for x in range(4):

GPIO.output(22,1)
time.sleep(0.1)
GPIO.output(22,0)
time.sleep(0.1)


# definit la page de nom index pour le site web
urls = ('/','index')
dossier_web = web.template.render('templates/')

app = web.application(urls, globals())

# definit l' action à effectuer quand la page index est appelée
class index:
# utilise quand la page est demande
def GET(self):

return dossier_web.index()

# traite une requete ajax
def POST(self):

global vset
global vertical
global horizontal
userdata = web.input()
if hasattr(userdata,'vitesse'):

if userdata.vitesse == '0':

vset=30

elif userdata.vitesse == '1':

vset=45

elif userdata.vitesse == '2':

vset=55

elif userdata.vitesse == '3':

vset=70

elif userdata.vitesse == '4':

vset=85

elif userdata.vitesse == '5':

vset=100

return(userdata.vitesse)
elif hasattr(userdata,'direction'):

if userdata.direction == 'avant':

vitmotd.start(vset)
vitmotg.start(vset)
GPIO.output(25,1)
GPIO.output(24,1)

elif userdata.direction == 'gauche':

vitmotd.start(vset)
vitmotg.stop()
GPIO.output(25,1)
GPIO.output(24,0)

elif userdata.direction == 'droite':

vitmotd.stop()
vitmotg.start(vset)
GPIO.output(25,0)
GPIO.output(24,1)

elif userdata.direction == 'arriere':

vitmotd.start(vset)
vitmotg.start(vset)
GPIO.output(25,0)
GPIO.output(24,0)

elif userdata.direction == 'stop':

vitmotd.stop()
vitmotg.stop()
GPIO.output(25,0)
GPIO.output(24,0)
Volt()

elif hasattr(userdata,'orientation'):

if userdata.orientation=='btb':

vertical=vertical +2
if vertical > 180:

vertical = 180

elif userdata.orientation=='bth':

vertical=vertical - 2
if vertical < 120:

vertical = 120

elif userdata.orientation=='btd':

horizontal=horizontal - 2
if horizontal < 120:

horizontal = 120
elif userdata.orientation=='btg':

horizontal=horizontal + 2
if horizontal >180:

horizontal = 180

class ServoThread(threading.Thread):
def run(self) :

global vertical
global horizontal
while True :

PWM.add_channel_pulse(0, 17, 0, horizontal)
PWM.add_channel_pulse(0, 18 ,0, vertical)
time.sleep(0.05)

# programme
if __name__ == '__main__':
myServo= ServoThread()
myServo.start()
GPIO.add_event_detect(15, GPIO.RISING)
GPIO.add_event_callback(15,StopEvent,50)
app.run()

john7864
Messages : 13
Enregistré le : ven. 1 nov. 2019 15:41

Re: Projects Voiture télécommandé depuis serveur web

Message par john7864 » mer. 6 nov. 2019 15:16

À présent j'ai réussi à faire fonctionner le serveur et client ensemble en supprimant dans le programme ce qui est lié à PMW.
Le programme s’exécute il fait tourner le serveur et discute avec le client a chaque pression d'un bouton.
Hélas le servo ne bouge pas ça coince du côté PMW je suppose, pour l'instant je continue ma recherche pour installer PMW
Si quelqu’un a des informations sûres comment l'installer et le rendre fonctionnel je suis preneur :D :D

john7864
Messages : 13
Enregistré le : ven. 1 nov. 2019 15:41

Re: Projects Voiture télécommandé depuis serveur web

Message par john7864 » mer. 6 nov. 2019 19:37

PMW c'est cuit pas disponible pour mon 3 b+ je passe à servoblaster j'ai la commande à exécuter pour mes directions qui est relativement simple echo 0+10 > /dev/servoblaster ou -10 .
Est-ce qu'une âme charitable serait m'indiquer comment envoyer ma commande en appuyant sur les boutons directionnels de gauche et de droite ?

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import web
import spidev
import RPi.GPIO as GPIO
from web import form
import threading


# definit la page de nom index pour le site web
urls = ('/','index')
dossier_web = web.template.render('templates/')

app = web.application(urls, globals())


# definit l action a effectuer quand la page index est appele
class index:

# utilise quand la page est demande
def GET(self):
return dossier_web.index()

# traite une requete ajax
def POST(self):
global vset
global vertical
global horizontal
userdata = web.input()
if hasattr(userdata,'vitesse'):
if userdata.vitesse == '0':
vset=30
elif userdata.vitesse == '1':
vset=45
elif userdata.vitesse == '2':
vset=55
elif userdata.vitesse == '3':
vset=70
elif userdata.vitesse == '4':
vset=85
elif userdata.vitesse == '5':
vset=100
return(userdata.vitesse)

elif hasattr(userdata,'direction'):
if userdata.direction == 'avant':
vitmotd.start(vset)
vitmotg.start(vset)
GPIO.output(25,1)
GPIO.output(24,1)
elif userdata.direction == 'gauche':
vitmotd.start(vset)
vitmotg.stop()
GPIO.output(25,1)
GPIO.output(24,0)
elif userdata.direction == 'droite':
vitmotd.stop()
vitmotg.start(vset)
GPIO.output(25,0)
GPIO.output(24,1)
elif userdata.direction == 'arriere':
vitmotd.start(vset)
vitmotg.start(vset)
GPIO.output(25,0)
GPIO.output(24,0)
elif userdata.direction == 'stop':
vitmotd.stop()
vitmotg.stop()
GPIO.output(25,0)
GPIO.output(24,0)
Volt()

elif hasattr(userdata,'orientation'):
if userdata.orientation=='btb':
vertical=vertical +2
if vertical > 180:
vertical = 180
elif userdata.orientation=='bth':
vertical=vertical - 2
if vertical < 120:
vertical = 120
elif userdata.orientation=='btd':
horizontal=horizontal - 2
if horizontal < 120:
horizontal = 120
elif userdata.orientation=='btg':
horizontal=horizontal + 2
if horizontal >180:
horizontal = 180

class ServoThread(threading.Thread):
def run(self) :
global vertical
global horizontal
while True :
PWM.add_channel_pulse(0, 17, 0, horizontal)
PWM.add_channel_pulse(0, 18 ,0, vertical)
time.sleep(0.05)


app.run()

john7864
Messages : 13
Enregistré le : ven. 1 nov. 2019 15:41

Re: Projects Voiture télécommandé depuis serveur web

Message par john7864 » jeu. 7 nov. 2019 13:16

Et voila j'ai enfin réussi :D :D :D :D :D :D :D :D :D :D :D :D :D :D merci servoblaster et Bud Spencer pour le serveur.
Si quelqu'un a besoin d'aide a ce sujet du coup . :D

Bud Spencer
Raspinaute
Messages : 630
Enregistré le : lun. 15 août 2016 21:38

Re: Projects Voiture télécommandé depuis serveur web

Message par Bud Spencer » jeu. 7 nov. 2019 20:04

Bravo \O/

N’hésites pas à partager tes galères et expliquer aux autres comment tu t’en ais sortie ;-)

Le châssis de ton truc semble sympa aussi et ça pourrais intéresser d’autres personnes. Si tu mettais le lien pour que d’autres puissent se le procurer et donner ton avis sur le côté rapport qualité/prix, ça pourrait aussi intéresser du monde.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

john7864
Messages : 13
Enregistré le : ven. 1 nov. 2019 15:41

Re: Projects Voiture télécommandé depuis serveur web

Message par john7864 » sam. 9 nov. 2019 15:36

Oui bien sûr avec plaisir.Là actuellement je viens d'ajouter une commande type ps3 pour diriger le servo avec Evdev :D :D :D :D :D :D
Par contre avec la commande que j'utilise avec servoblaster pour que le servo se déplace de sa positon a +20 ou -20 à encore un mouvement fluide avec la manette ps3.
Par le web ce n'est pas aussi fluide en pressant le bouton l'instruction est envoyé et il faut attendre un léger temps d'attente entre chaque pression.
Si l'on reste appuyer sur le bouton une seule instruction est envoyée et c'est là que ça coince à mon avis :?: :?:
L'idéal serait d'afficher sur la page web une barre de Control pour la direction, qui en restant appuyé enverrait la commande de la position déterminée.

Répondre

Retourner vers « Projets »