[Crowd-Mower] - ein Rasenmäher, den jeder über das Internet steuern kann

Hast du eine Minute Zeit? Könnten Sie meinen Rasen mähen?


Eine kurze Geschichte der Entwicklung am Knie eines Rasenmäherroboters. Sie können es von überall auf der Welt über das Internet verwalten. Träumten Sie davon, sich wie ein Fahrer eines Rovers oder eines Mondrovers zu fühlen? Gehen Sie einfach auf die Website mowmylawn.ru und Sie können den Mäher in meinem Garten steuern!




Hintergrund


Die ganze Geschichte der Rasenmäher begann im Sommer 2015. In meinem ersten Beitrag zu GT ging es nur um meine Erfahrung mit dem Verkauf von Robotermähern aus der Garage.

Tv



Danach schlugen Vertreter von Robomow vor, ihre Plattform für die weitere Entwicklung zu nutzen. Dies ist sehr praktisch, da alle Fragen zu Hardware und Mechanik besondere Fähigkeiten erfordern und viel Zeit in Anspruch nehmen.

Ich wollte unbedingt einen Wettbewerb für Rasenmäherroboter organisieren . Wie sich herausstellte, ist dies keine leichte Aufgabe. Es wurden mehr als 15 Teams registriert, aber am Ende zeigten nur drei Teilnehmer den Fortschritt.

Roman Sakovich, Minsk (Weißrussland), 'Belmower'
: . , .

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

: RTK, . .

: GPS/GLONASS. . . .



Feofanov I. A., Tver


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

Nikolay Mironnikov, Nowosibirsk



Alle Bemühungen, einen Wettbewerb in Skolkovo abzuhalten, waren vergebens. Am Ende stellte sich heraus, dass es in Skolkovo keine freien Rasenflächen für den Robotikwettbewerb gab. Alle möglichen Sponsoren wollen sich nicht mit unklaren Aussichten auf den neuen Wettbewerb einlassen. Ich habe nicht einmal eine Antwort auf Briefe an kommunale Organisationen erhalten. Infolgedessen hatten wir eine vage Aussicht, einen Wettbewerb für 4 Teilnehmer aus verschiedenen Städten zu organisieren. Obwohl sich der Wettbewerb als international herausstellte, war es dennoch zweckmäßiger, ihn abzusagen, was nicht schade ist.

Robocower 2016. ROS & SPASS


Ich lerne ROS und schreibe einen Launcher für einen Robotermäher. Ich benutze Kinect und SLAM. Nur bei visueller Kilometerzähler erstellt der Roboter eine Karte und zeichnet eine Route. Kinect funktioniert bei sonnigem Wetter nicht gut. Mit ROS machst du an einem Abend „Hallo Welt!“ Und dann Dunkelheit. Ich habe nie eine normale Anleitung für Anfänger gefunden, wie man einen Roboter baut und nicht nur in Themen schreibt. Hat sich jemals jemand gefragt, warum es in der Russischen Föderation KEINEN einzigen Punkt auf der ROS-Community-Karte gibt ? Ich habe eine VK-Gruppe eröffnet .


In seiner Freizeit schraubte er zwei Servos, einen Ultraschallsensor und einen Arduino, an die Stangen seines „Arbeitstiers“. Ein einfacher Test von Birkenumweg und Stopp bestanden! Und dann der Abgrund, es ist gefährlich, dieses Ding einfach durch deine Website zu lassen! Sie wird nicht einmal in der Lage sein, wie Roboter zu treten, weißt du wie.


Es stellt sich heraus, dass Roboter - für die meisten Menschen, insbesondere für Serviceroboter, sind die Dinge ziemlich langweilig. Ja, ich kenne die große Freundschaft von Roboterstaubsaugern und Katzen. Ich kenne Superkreationen von Boston Dynamics, Darpa und dem russischen Kampfroboter-Avatar. Dies ähnelt eher Robotern als einer Box, in der ein bestimmter Algorithmus mit der realen Welt interagiert.

Nach dem Verständnis meiner Tochter sind Roboter zumindest Transformatoren und nicht der Müll, mit dem ich Zeit verbringe. Ich traf eine schwierige Entscheidung und machte „vorübergehend“ ein Spielzeug auf einer Bluetooth-Steuerung aus einem Robotermäher.



Das Management funktioniert genauso wie die Schneefräse . Es hat Spaß gemacht! Besonders für Papa.

Schneefräse Video




Weiter - mehr! Ich war an der Idee interessiert, die Steuerung nicht über Bluetooth, sondern über das Internet mit Telemetrie zu implementieren. Gelangweilte, frische und abgedroschene Idee!

Aber was ist, wenn ein Internetnutzer meinen Rasenmäher steuern darf? Kennen Sie solche Ideen, die dann schwer aus dem Kopf zu bekommen sind? Es war nur so ... Herausforderung angenommen!

Menschenmäher



Eisen





Himbeer-Pi, USB-Hub, WLAN-Adapter und Webcam werden der Magic Box ordentlich hinzugefügt.
Von interessanten Punkten auf Eisen. Ich hatte keinen Fahrer mit den richtigen Eigenschaften für die Motoren. Normalerweise wird eine H-Brücke für Feldeffekttransistoren oder (Hardcore) für ein Relais als Treiber verwendet. Ich wähle eine starrere Option, weil die Relais verfügbar waren.



Das übliche Verbindungsschema impliziert 4 Schlüssel für jeden Motor, d.h. 8 auf 2 laufenden Motoren.



In Anbetracht der Tatsache, dass der normalerweise offene Zustand des Relais verwendet werden kann und die Motoren nicht separat eingestellt werden müssen, können Sie nur 5 Relais für zwei laufende Motoren verwenden.

Zusätzlich zum Roboter selbst ist im Haus eine Kamera installiert, die eine Frequenz von 3 Bildern / Sek. Hat. lädt zur besseren Orientierung ein Übersichtsfoto der Site auf den FTP-Server im Internet hoch. Aber anschließend einfach durch eine Lösung von ivideon ersetzt.

Das Programm


Nach wie vor empfängt Arduino an der seriellen Schnittstelle eine Nachricht mit einem einzelnen Zeichen, die die erforderliche Aktion angibt. Auch zum Testen und Debuggen werden die von Himbeere empfangenen Codes über Bluetooth gesendet. Sie können das Telefon im Terminalmodus verbinden und Daten vom Server auch auf dem Telefon empfangen.

Skizze 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{
      
    }
  
}




Zwei Python-Skripte arbeiten mit Himbeeren. Eines der Skripte mit opencv erfasst Videos von einer auf dem Rover installierten Webcam und lädt sie per FTP auf den Server hoch. Mit einiger Wahrscheinlichkeit wird das Foto zusammen mit einer zufälligen Nachricht aus der Liste auf das Twitter-Konto hochgeladen .

Erstes Skript
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



Das zweite Skript über http empfängt den aktuellen Befehl zum Handeln auf dem Server und sendet diesen Befehl über seriell an arduino.
  • "S" - aufhören
  • "F" - mach weiter
  • "B" - zurück
  • "L" - links
  • "R" - rechts
  • "W" - Mähmotoren aktivieren
  • "W" - Mähmotoren abstellen
  • "V" - Signal einschalten
  • "V" - Signal ausschalten


Zweites Skript
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



Webdienst


Ich habe eine Seite zum Bootstrap hochgeladen. Auf der Seite befinden sich zwei JPG-Dateien, die beim Herunterladen aktualisiert werden. Es gibt viele Faktoren, die Verzögerungen bei der Steuerung und Telemetrie beeinflussen. Dies ist Ihre Verbindungsgeschwindigkeit, der Kanal auf dem Server und der Kanal bei mir.

Code aktualisieren .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>



Die maximale Aktualisierungsrate, die ich erreicht habe:
  • Kamera am Rover 4 Hz;
  • Die Kamera im Haus ist 3 Hz.

Die MySQL-Datenbank besteht aus 2 Tabellen, die erste enthält ein Schlüssel / Wert-Paar. Dies ist ein Befehl für den Roboter. Die zweite Tabelle enthält Benutzer.
Wenn Sie sich in der Warteschlange auf der Site befinden, wird eine Ajax-Abrufanforderung zum Hinzufügen des Benutzers gesendet, ein Datensatz mit der Zeitstempelmarkierung, Ihrer IP-Adresse und dem generierten Steuerschlüssel wird in die Datenbank eingegeben.

Nur eine Person kann gleichzeitig den Mäher steuern (außer mir) - dies ist der Benutzer mit dem kleinsten Zeitstempel. Wenn Sie an der Reihe sind und mit der Steuerung des Mähers beginnen, geben Sie den Zeitstempel des Starts der Verwaltung in die Datenbank ein. Jeder hat 60 Sekunden Zeit, um ...



Jedes Mal, wenn Sie auf die Steuertasten zeigen, wird eine Ajax-Abrufanforderung mit dem Befehl und Ihrer Steuertaste gesendet, und die Differenz zwischen der aktuellen Zeit und der Zeit, zu der Sie das „Spiel“ gestartet haben, wird überprüft. Wenn die Differenz mehr als 60 Sekunden beträgt, endet das Spiel für Sie, Ihre Aufzeichnung von der Basis entfernt und Sie können wieder anstehen, das "Spiel" geht an den nächsten Spieler.

Promo-Video




Dann denke ich, dass es notwendig ist, auf Englisch zu drehen ... und dann hat Ostap gelitten.








Mein erster Beitrag auf reddit . Versuchen Sie, mowmylawn.ru zu verwalten . Im Falle einer großen Warteschlange oder eines Habraeffekts - bitte verstehen und vergeben.

PS: Denken Sie daran, dass Sie an einem gemeinsamen Projekt zur Entwicklung eines Fitness-Trackers für den Schocksport KickBrick teilnehmen können . Das Team wartet auf Sie!

UPD: Ich hatte drei Probleme, zwei bereits gelöst.
1) Wenn die Manöver zu aktiv sind, wurde das Stromversorgungskabel für die ~ 27-V-Antriebsmotoren abgezogen und einer der Motoren bewegte sich nicht vorwärts.
2) Anscheinend ist der WLAN-Adapter aufgrund des gleichen Kabels durchgebrannt.
3) Eine große Anzahl von Benutzern mit GT und reddit führte zuerst zur Warteschlange von mehr als 1000 Benutzern, dann stürzte der Server ab. Optimierung ist unser Alles!

UPD: Ich musste Arduino ersetzen und die Warteschlange bereinigen. Sie können es versuchen.

UPD:

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


All Articles