Vi har tidigare testat Raspberry Pi tillsammans med två motorkontrollerkort, L298 (länk till testet) och RaspiRobot Board v2 (länk till testet). I båda fallen använde vi biblioteket för RaspiRobot Board v2.

Men dessa små exempel var väldigt basala, och roboten rör sig på samma sätt varje gång. Nu vill vi göra något roligare, och på samma gång lära oss lite mer Python!

Denna guide-serie lämpar sig väl för dig som kan lite mer programmering, eller som bara vill kopiera och klistra in koden för att testa slutprodukten. Vi går också igenom steg för steg vad som sker, så alla kan nog lära sig lite!

Vi kommer titta på hur man programmerar en simpel webbserver i Python. Vi ska också lära oss lite om SOA, “Server-oriented architecture”, vilket jag tänkt dra inspiration av för att kontrollera roboten. Vi kommer också använda picamera, ett kamera-bibliotek för kameramodulen, för att streama bild från kameran för att det hela ska bli en fullfjädrad spionrobot! 😀

Jag döper den fyndigt till mbot, efter Hansons välkända låt med samma namn. 😉

SOA, varför då?

För några år sedan ställde Jeff Bezos, Amazons VD, ett krav på sina anställda. Alla Amazons arbetslag skulle bygga om sina system och exponera all sin data genom tjänster. Detta innebar att allting fick byggas om och delas upp i så små beståndsdelar som möjligt, för att dessa sedan skulle samverka med varandra. Detta var enormt mycket jobb, men när det var färdigt fanns en stor fördel jämfört med hur systemen var uppbyggda innan: de andra teamen kunde mycket lättare ta del av, och använda sig av ett teams tjänster och data och på så sätt snabbt och smidigt skapa nya tjänster. Detta har till slut kulminerat i Amazon Web Services, som erbjuder molntjänster till alla. Här finns en väldigt intressant text som behandlar detta ämne och även tar upp varför Google borde göra detta bättre.

Men varför vill man då använda det? Man skulle kunna likna det vid att jämföra Lego med en färdigbyggd leksak. De kan göra samma sak, men Legot kan också brytas ner i mindre beståndsdelar och användas med andra bitar för att bygga något helt annat.

Jag skulle till exempel kunna skriva ett färdigt, enkelt interface för att kommunicera med roboten, och sen vara nöjd. Men det tänker jag inte göra. Jag tänker låta HTTP-anrop styra roboten, så i princip kan man säga att alla kommandon man kan skicka till den kommer vara sin egen “tjänst”. Likaså för videoströmmen, i den mån det går. Vad man då har i slutändan är en (förhoppningsvis) väldokumenterad webbtjänst som tar emot kommandon och baserat på det utför kommandon och returnerar resultat.

När det är färdigt kan jag sen skapa en frontend, i HTML, eller Java, eller vad jag vill. Vem som helst kan enkelt skapa sin egen frontend. Man kan till och med skapa en artificiell intelligens som styr roboten på distans, om man så vill.

Jag förutsätter att alla som läser det här nu är övertygade om hur smart och kraftfullt det är att göra SOA-tjänster! 😀

Förberedelser, hårdvara

En inledande varning! Anslut ej USB-ström till Raspberry Pi samtidigt som batteripacket är anslutet till RRBv2. Använd det ena eller det andra!

Till att börja med behöver vi såklart specificera vilken hårdvara som behövs. Så här kommer listan så här långt (jag kommer använda RRBv2 då det blir mindre kablar att dra):

Raspberry Pi Model B+ med nödvändiga tillbehör – drar mindre ström än Model B, men är inte lika begränsad som Model A. Lämpliga tillbehör: SD-kort, WiFi-adapter, tangentbord/mus samt USB-strömförsörjning är bra att ha när man installerar allting.

Raspberry Pi Camera Module – Vi vill ju inte bara kunna styra roboten, utan titta på dess omgivning också!

RaspiRobot Board v2 – Helt enkelt enklare att använda. Har också lite fler ingångar om man vill ansluta t.ex. en avståndsmätare.

2WD robotkit med motorer – RRBv2 är byggd för att användas med två motorer, så då gör vi så. 🙂

Batteripack – Vad man vill använda för batteri/er är såklart valfritt, men de behöver kunna driva både Raspberryn och de två motorerna.

Ett trådlöst hemnätverk – ett sådant behövs såklart för att komma åt Raspberryn trådlöst 😀

Förberedelser, mjukvara

Raspbian – smidigt att installera, smidigt att installera nya paket, och mycket fungerar out-of-the-box. Däribland Python. Jag antar också att du anslutit RPin till ett nätverk. Kabelanslutning fungerar utmärkt under konfigureringen.

För att installera RRBv2-biblioteket, skriv följande rader i terminalen för att ladda ner, packa upp och slutligen installera det (görs förslagsvis i hemmappen):

wget https://github.com/simonmonk/raspirobotboard2/raw/master/python/dist/rrb2-1.1.tar.gz
tar -xzf rrb2-1.1.tar.gz
cd rrb2-1.1
sudo python setup.py install

Installation av paketet för att arbeta mot kameran görs också enklast i terminalen:

sudo apt-get update
sudo apt-get install python-picamera

För att enkelt skapa en webbserver använder jag Python-biblioteket Flask, vilket är ett webb-framework som installeras med hjälp av något som heter pip. Dessa installeras som följer:

sudo apt-get install python-pip
sudo pip install flask

Nu är vi redo att börja sätta upp webbservern i Python!

Smidigast för de som inte är vana att programmera är att använda sig av IDLE. Det är inkluderat i Raspbian och det är lätt att köra koden när man känner för det. Den största nackdelen är att det inte är något vidare på att “framhäva” koden.

Vi börjar med koden för att importera från de olika paketen vi precis har installerat:

from flask import Flask, render_template
from rrb2 import *
import datetime

I princip kan man säga att användaren skickar ett kommando via http på formen http://serveradress/kommando och detta tolkas av vår webbserver som delegerar kommandot och returnerar ett svar som HTML, t.ex. för att bekräfta huruvida kommandot gick att genomföra.

render_template kan vi använda för att förbereda små html-filer vi kan returnera som svar på de olika kommandona användaren skickar. datetime använder vi för att kunna hämta in tiden från operativsystemet.

Detta var en liten smygstart, för att inte inlägget ska bli för långt sparar vi den fortsatta programmeringen till nästa inlägg! Håll ut så länge 🙂