[Crowd-mower] - une tondeuse à gazon que tout le monde peut contrôler sur Internet

As tu une minute Pourriez-vous tondre ma pelouse?


Une brève histoire du développement sur le genou d'un robot de tonte. Vous pouvez le gérer de n'importe où dans le monde via Internet. Vous rêviez de vous sentir comme l'opérateur d'un rover ou d'un rover lunaire? Allez sur le site mowmylawn.ru et vous pouvez contrôler la tondeuse dans ma cour!




Contexte


Toute l'histoire des tondeuses à gazon a commencé à l'été 2015, mon premier article sur GT concernait à peu près mon expérience dans la vente de tondeuses robotisées à partir de ce qui se trouvait dans le garage.

Tv



Après cela , les représentants de Robomow ont suggéré d'utiliser leur plate-forme pour un développement ultérieur. C'est très pratique, car toutes les questions sur le matériel et la mécanique nécessitent des compétences spéciales et prennent beaucoup de temps.

Je voulais vraiment organiser un concours pour les tondeuses à gazon robotisées . Il s'est avéré que ce n'était pas une tâche facile. Plus de 15 équipes étaient inscrites, mais au final, seuls trois participants ont montré les progrès.

Roman Sakovich, Minsk (Biélorussie), «Belmower»
: . , .

: . Raspberrry Pi — . , , . Nucleo stm32 — . , , .

: RTK, . .

: GPS/GLONASS. . . .



Feofanov I.A., Tver


, , . , . , , — ( , ).

Nikolay Mironnikov, Novossibirsk



Tous les efforts pour organiser un concours à Skolkovo ont été vains. En fin de compte, il s'est avéré qu'il n'y avait pas de pelouses gratuites pour le concours de robotique à Skolkovo. Tous les sponsors potentiels ne veulent pas jouer avec la nouvelle compétition avec des perspectives incertaines. Je n'ai même pas eu de réponse aux lettres aux organisations municipales. En conséquence, nous avions une vague perspective d'organiser un concours pour 4 participants de différentes villes. Bien que le concours se soit avéré international, il était néanmoins plus opportun de l'annuler, ce qui n'est pas dommage.

Robocower 2016. ROS & FUN


J'apprends le ROS et j'écris un lanceur pour une tondeuse robot, j'utilise Kinect et SLAM, ce n'est que sur l'odométrie visuelle que le robot construit une carte et trace un itinéraire. Kinect ne fonctionne pas bien par temps ensoleillé. Avec ROS, vous ferez «Hello World!» En une soirée, puis dans l'obscurité. Je n'ai jamais trouvé de guide normal pour un débutant sur la façon de fabriquer un robot, et pas seulement d'écrire des sujets. Quelqu'un s'est- il déjà demandé pourquoi il n'y a PAS un seul point dans la Fédération de Russie sur la carte de la communauté ROS ? J'ai ouvert un groupe VK .


Dans ses temps libres, il a vissé deux servos, un capteur à ultrasons et un Arduino aux tiges de son «cheval de bataille». Un simple test de détour par bouleau et arrêt réussi! Et puis l'abîme, il est dangereux de laisser cette chose traverser votre site! Elle ne pourra même pas frapper comme des robots que vous savez comment.


Il s'avère que les robots - les choses sont assez ennuyeuses dans la compréhension de la plupart des gens, en particulier des robots de service. Oui, je connais la grande amitié des aspirateurs robotiques et des chats. Je connais les super créations de Boston Dynamics, Darpa et l'avatar du robot de combat russe, cela ressemble plus à des robots qu'à une boîte dans laquelle un certain algorithme interagit avec le monde réel.

Dans la compréhension de ma fille, les robots sont au moins des transformateurs, et non les déchets sur lesquels je passe du temps. J'ai pris une décision difficile et j'ai «temporairement» fabriqué un jouet sur une commande Bluetooth à partir d'une tondeuse robotique.



La gestion fonctionne de la même manière que la souffleuse à neige . Cela s'est avéré amusant! Surtout pour papa.

Vidéo de la souffleuse à neige




Plus loin - plus! J'étais intéressé par l'idée de mettre en œuvre le contrôle non pas sur Bluetooth, mais via Internet, avec la télémétrie. Idée ennuyée, fraîche et galvaudée!

Mais que se passe-t-il si un utilisateur Internet est autorisé à contrôler ma tondeuse à gazon? Connaissez-vous de telles idées qui sont alors difficiles à sortir de votre tête? C'était juste que ... Défi accepté!

Tondeuse de foule



Le fer





Raspberry pi, concentrateur USB, adaptateur wifi, webcam sont soigneusement ajoutés à la boîte magique.
De points intéressants sur le fer. Je n'avais pas de pilote avec les bonnes caractéristiques pour les moteurs. Habituellement, un pont en H pour les transistors à effet de champ ou (hardcore) pour un relais est utilisé comme pilote. J'ai choisi une option plus rigide, car ce sont les relais qui étaient disponibles.



Le schéma de connexion habituel implique 4 clés pour chaque moteur, c'est-à-dire 8 sur 2 moteurs en marche.



Étant donné qu'il est possible d'utiliser l'état normalement ouvert du relais ainsi que le fait qu'il n'est pas nécessaire de régler les moteurs séparément, vous pouvez faire seulement 5 relais pour deux moteurs en marche.

En plus du robot lui-même, une caméra est installée sur la maison, avec une fréquence de 3 images / sec. télécharge une photo d'ensemble du site sur le serveur ftp sur Internet pour une meilleure orientation. Mais par la suite simplement remplacé par une solution d'ivideon.

Le programme


Comme précédemment, Arduino reçoit un message à un seul caractère sur le port série, ce qui indique l'action nécessaire. Également pour les tests et le débogage, les codes reçus de la framboise sont envoyés via Bluetooth, vous pouvez connecter le téléphone en mode terminal et recevoir des données du serveur également sur le téléphone.

Croquis Arduino
int m1=2;
int m1b=3;
int m2=4;
int m2b=5;
int mk=6;
int pis=7;


char a,b;

void setup()  
{
Serial.begin(9600);
Serial1.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  while (!Serial1) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("Start");

 pinMode(statpin, OUTPUT);
 pinMode(m1, OUTPUT);
 pinMode(m1b, OUTPUT);
 pinMode(m2, OUTPUT);
 pinMode(m2b, OUTPUT);
 pinMode(mk, OUTPUT);
 pinMode(pis, OUTPUT);

analogWrite(pis,  1000);
delay(100);
analogWrite(pis,  700);
delay(200);
analogWrite(pis,  300);
delay(300);
analogWrite(pis,  1000);
delay(100);
analogWrite(pis,  100);
digitalWrite(pis,  HIGH);
 digitalWrite(statpin, LOW);
digitalWrite(m1, LOW);
digitalWrite(m1b,  LOW);
digitalWrite(m2, LOW);
digitalWrite(m2b,  LOW);
digitalWrite(mk,  LOW);
digitalWrite(pis,  HIGH);

}

void loop() // run over and over
{

  if (Serial.available()){
     a=Serial.read();
     Serial1.println(a);

    if(a=='B'){
digitalWrite(m1, HIGH);
digitalWrite(m1b,  LOW);
digitalWrite(m2, HIGH);
digitalWrite(m2b,  LOW);
    }
    if(a=='F'){
digitalWrite(m1, HIGH);
digitalWrite(m1b, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m2b,  HIGH);
    }
    if(a=='R'){
digitalWrite(m1, HIGH);
digitalWrite(m1b, LOW);
digitalWrite(m2, HIGH);
digitalWrite(m2b,  HIGH);
    }
    if(a=='L'){
digitalWrite(m1, HIGH);
digitalWrite(m1b, HIGH);
digitalWrite(m2, HIGH);
digitalWrite(m2b,  LOW);
    }

       if(a=='S'){
digitalWrite(m1, LOW);
digitalWrite(m1b, LOW);
digitalWrite(m2, LOW);
digitalWrite(m2b,  LOW);
    }

       if(a=='W'){
digitalWrite(mk, HIGH);
    }  
       if(a=='w'){
digitalWrite(mk, LOW);
    }   

       if(a=='V'){
digitalWrite(pis, LOW);
    }  
       if(a=='v'){
digitalWrite(pis, 700);
    }   
  
    }else{
      
    }
  
}




Deux scripts python fonctionnent sur la framboise. L'un des scripts utilisant opencv capture la vidéo d'une webcam installée sur le mobile et la télécharge via ftp sur le serveur. En outre, avec une certaine part de probabilité, la photo ainsi qu'un message aléatoire de la liste sont téléchargés sur le compte Twitter .

Premier script
import numpy as np
import sys
import pygame
import pygame.camera
from pygame.locals import *
from twython import Twython
from random import random
import ftplib


pygame.init()
pygame.camera.init()
cam = pygame.camera.Camera("/dev/video0",(550,400))
cam.start()

CONSUMER_KEY = '-------MBZDT1PwibFeIcSp'
CONSUMER_SECRET = '-----------------1ZGHgBRz6aEr4YhUVuO84CuEV'
ACCESS_KEY = '-----------------4MCjSkny9Y6rJj5I32ulXctISQF'
ACCESS_SECRET = '------------------------cDadRY3He5Kv6CXVuqy2Dh'
api = Twython(CONSUMER_KEY,CONSUMER_SECRET,ACCESS_KEY,ACCESS_SECRET)
api.verify_credentials()

host = "-.--.---.196"
ftp_user = "ftp_user"
ftp_password = "ftp_password"
con = ftplib.FTP(host, ftp_user, ftp_password)
con.cwd("/mowmylawn.ru/webcam")

a={0:' !   !',1:'  .   !',2:'     ...    ',3:'      ?',4:',   !',5:'  ,        :)) !',6:', ... !',7:' ,     .',8:'  :  -  ',9:'  —  ,    ...',10:'    :    ?',11:'  ',11:'-,   ',12:' -  ,         .',13:'—     ! — ,    !',14:',   ! ...:(((!',15:'  ? robogazon.ru',16:' ,    !'}

def twit():
    image = cam.get_image()
    pygame.image.save(image,'webcam.jpg')
    photo = open('webcam.jpg','rb')
    b = random() * (len(a)-1)
    b = int(round(b,0))
    #api.upload_media(media=photo)
    #api.update_status(status=a[b])
    api.update_status_with_media(media=photo, status=a[b])

def ftpimg():
    image = cam.get_image()
    pygame.image.save(image,'webcam.jpg')
    photo = open('webcam.jpg','rb')
    send = con.storbinary("STOR "+ 'webcam.jpg', photo)

while 1 :
    ftpimg()
    b = random() * (500)
    b = int(round(b,0))
    if b==107:
        twit()

con.close



Le deuxième script via http reçoit la commande en cours pour action sur le serveur et envoie cette commande via série à arduino.
  • "S" - arrêter
  • "F" - allez-y
  • "B" - retour
  • "L" - à gauche
  • "R" - à droite
  • "W" - activer les moteurs de tonte
  • "W" - éteindre les moteurs de tonte
  • "V" - allume le signal
  • "V" - couper le signal


Deuxième script
import serial,time
import urllib3

http = urllib3.PoolManager()


ser = serial.Serial("/dev/ttyUSB0",9600)
ser.writelines("S");

olddata=0
countolddata=0
while 1 :
    r = http.request('GET', 'http://mowmylawn.ru/1.php')
    
    if r.data!=olddata:
        olddata=r.data
        countolddata=0
    else:
        countolddata+=1
    
    if countolddata>20:
        ser.writelines("S")
    else:
        ser.writelines(r.data)

ser.close()
con.close



Service Web


J'ai téléchargé une page sur bootstrap. Il y a deux fichiers .jpg sur la page, qui sont mis à jour lors du téléchargement. De nombreux facteurs influencent les retards de contrôle et de télémétrie, il s'agit de votre vitesse de connexion, du canal sur le serveur et du canal à ma place.

Mettre à jour le code .jpg
<script>
setInterval(function(){
var im1='http://mowmylawn.ru/webcam/webcam.jpg?s='+Math.random();
var im2='http://kosmos-podolsk.ru/webc1.jpg?s='+Math.random();
var tmpImg = new Image() ;
    tmpImg.src = im1 ;
    tmpImg.onload = function() {
         $("#w1dd").attr('src',im1 );
    } ;

    tmpImg.src = im2 ;
    tmpImg.onload = function() {
         $("#w2dd").attr('src',im2 );
    } ;	

}, 200);
</script>



Le taux de rafraîchissement maximum que j'ai réussi à atteindre:
  • caméra sur le mobile 4 Hz;
  • la caméra sur la maison est de 3 Hz.

La base de données Mysql se compose de 2 tables, la première contient une paire clé / valeur, il s'agit d'une commande pour le robot. Le deuxième tableau est les utilisateurs.
Lorsque vous arrivez dans la file d'attente sur le site, une demande get ajax est envoyée pour ajouter l'utilisateur, un enregistrement avec la marque d'horodatage, votre ip et la clé de contrôle générée est entré dans la base de données.

Une seule personne peut contrôler la tondeuse en même temps (sauf moi) - c'est l'utilisateur avec le plus petit horodatage. Lorsque votre tour arrive et que vous commencez à contrôler la tondeuse - entrez l'horodatage du début de la gestion dans la base de données, chacun dispose de 60 secondes pour contrôler ...



Chaque fois que vous pointez sur les boutons de contrôle, une requête get ajax est envoyée avec la commande et votre touche de contrôle, et la différence entre l'heure actuelle et l'heure à laquelle vous avez commencé le «jeu» est vérifiée, si la différence est supérieure à 60 secondes, le jeu se termine pour vous, votre dossier retiré de la base et vous pouvez à nouveau faire la queue, le "jeu" va au joueur suivant.

Vidéo promotionnelle




Ensuite, je pense qu'il faut tourner en anglais ... et ensuite Ostap a souffert.








Mon premier post sur reddit . Essayez de gérer mowmylawn.ru . Dans le cas d'une grande file d'attente ou d'un habraeffet - veuillez comprendre et pardonner.

PS: N'oubliez pas que vous pouvez participer à un projet commun pour développer un tracker de fitness pour les sports de choc KickBrick . L'équipe vous attend!

UPD: J'ai eu trois problèmes, deux déjà résolus.
1) Lorsque les manœuvres sont trop actives, le câble d'alimentation des moteurs de propulsion ~ 27V a été déconnecté et l'un des moteurs n'a pas avancé.
2) Apparemment, en raison du même fil, l'adaptateur wi-fi a grillé
3) Un grand nombre d'utilisateurs avec GT et reddit a d'abord conduit à la file d'attente de plus de 1000 utilisateurs, puis le serveur s'est écrasé. L'optimisation est notre tout!

UPD: J'ai dû remplacer Arduino et nettoyer la file d'attente. Tu peux essayer.

UPD:

Source: https://habr.com/ru/post/fr397391/


All Articles