Spree Spring Party 2017

Tekniken bakom eventet

Den 17e maj 2017 anordnade Spree en fest. Till festen hade en hel del mjukvara och en hel del hårdvara utvecklats för att göra upplevelsen så interaktiv och unik som möjligt. Här tänkte jag fokusera på hur hårdvaran fungerade och var designad. Hårdvarumässigt handlar det egentligen om två olika lösningar. Alla våra RFID-läsare, både de som används för att starta och att registrera sig, samt de trådlösa lådorna, ser likadana ut på insidan. Roboten bishop däremot använder en helt annan lösning. De små RFID-läsarna använder en mikrokontroller som heter NodeMCU, som är en utvecklingsbräda baserad på wifi-modulen ESP8266. Är man bekant med Arduino och dess utvecklingsmiljö är NodeMCU väldigt lättanvänd, eftersom den går att programmera direkt via Arduino IDE. Även om NodeMCU är begränsad i sina GPIO, exempelvis finns endast en ADC, har den åtminstone de vanliga protokollen SPI och I2C, vilket innebär att den kan kommunicera med de en uppsjö komponenter. Bland dessa finns den RFID-läsare vi valde att använda för att läsa av en taggning från användarna, MFRC522, som kommunicerar via SPI.

Utöver RFID-läsaren var också en enkel lysdiod inkopplad, som blinkade efter bestämda mönster för att visa både att en RFID-tagg hade upptäckts, och för att visa att serverkommunikationen hade gått som avsett, där servern hade godtagit och svarat på det inkommande meddelandet.Kommunikationen mellan NodeMCU och server gick via TCP. Varje gång en användare taggade RFID-läsaren öppnades en ny anslutning till servern, som sedan stängdes ned igen efter att meddelandet skickats och svar mottagits. Dock bröts själva WIFI-anslutningen aldrig. Detta berodde huvudsakligen på att en WIFI-anslutning tar en stund att etablera, medan en TCP-anslutning går snabbt. Ett argument för att inte hålla igång WIFI-anslutningen konstant skulle kunna vara att detta drar en hel del ström. Vår lösning drar uppskattningsvis någonstans kring 300mA, vilket är ganska mycket i IoT-sammanhang. Men, eftersom vi valde att driva många av lösningarna via vanliga mobilladdare, där även de enklare modellerna klarar av att leverera 1A, såg vi inget problem i detta. De trådlösa varianterna, våra ”hidden tags”, drevs av s.k. powerbanks till mobiltelefoner. Den modell vi valde hade en kapacitet på 2600 mAh, vilket innebär att vi kunde driva varje lösning i ungefär 8-9 timmar. Skulle det vara intressant att driva lösningarna under längre tid finns en rad alternativ för att åstadkomma detta.

Dels skulle man kunna utnyttja de sleep-funktioner som finns att tillgå i ESP8266, vilket skulle dra ner strömförbrukningen något. Skulle behovet finas för betydligt längre driftstider, kan spänningsmatningen ändras från 5V till 3.3V, vilket är den logikspänning som används både på ESP8266 och MFRC522. Detta skulle innebära att den spänningsregulator som sitter på NodeMCUn kan avlägsnas, vilket skulle spara ett par mA. Även den USB till UART-krets som sitter monterad på NodeMCUn drar relativt mycket ström. Eftersom att denna krets endast behövs under utvecklingsfasen kan den faktiskt avlägsnas helt, eller lödas om på ett sådant sätt att den manuellt kan slås av och på vid behov. I slutändan borde dessa ingrepp kunna förlänga batteritiden till dagar eller veckor.

Bishop

Den lilla roboten Bishop var byggd i Lego, huvudsakligen eftersom att Lego är sjukt kul att bygga med och lämpar sig väldigt väl att ta fram prototyper i. Rakt mot alla regler som gäller för Lego limmades sedan denna grund fast i ett 3D-printat skal som designats för ändamålet. Eftersom att temat på festen var ”Tidsresa”, valde vi att ge en liten vinkning åt TV-serien ”Doctor Who”, och låta Bishops form vara en nedskalad version av en Dalek.

Bishop hade ett lite mer elektronik under huven än RFID-läsarna. Bishop var baserad på en Arduino M0 Pro, en utvecklingsbräda framtagen av Arduino, baserad på en Cortex M0 mikrokontroller. M0 pro ser till formen väldigt mycket ut som den populära Arduino UNO-brädan, men är betydligt mycket mer avancerad. Den är snabbare och har mer minne, och en rad funktioner som inte finns på UNO. Exempelvis har M0 Pro en DAC, flera Seriella portar och nästan alla GPIO kan agera som PWM. Den har dock ingen WIFI-modul, vilket innebar att vi fick använda en extern sådan. Även här valde vi att använda modulen ESP8266, fast i det här fallet som fristående modul, inte placerad på utvecklingsbrädan NodeMCU. Eftersom att ESP8266 själv innehåller en mikroprocessor kan man enkelt kommunicera med den seriellt, med endast en TX och RX-kabel. Här kommer det faktum att M0 Pro har tillgång till flera seriella portar till nytta. ESP8266 kan kontrolleras med hjälp av AT- kommandon på en seriell port, samtidigt som en seriell kommunikation via USB kan hållas som vanligt för att kommunicera med en dator. Precis som på de andra lösningarna användes en MFRC522 för att läsa gästernas RFID-taggar, och kommunicerade via SPI.

För att interagera med sin omgivning användes också tre stycken ultraljudssensorer, med vilka man kan mäta avstånd. Genom att skicka ut en ljudpuls och mäta tiden det tar för ett eko att återvända kan man avgöra avståndet till objekt i omgivningen. En sensor pekade rakt fram, och de två andra pekade med åt sidorna. Med hjälp av dessa kunde roboten avgöra om den var på väg att krocka med något, och då backa upp och rotera antingen åt höger eller vänster, beroende på vilken sensor som reagerat. Dessa ultraljudssensorer kommunicerar inte via något protokoll, utan behöver bara två vanlig GPIOs var, en för att skicka iväg en ljudpuls, och en pinne att lyssna på svaret. Motorerna som gav Bishop liv var vanliga DC-motorer, av märket Lego. Eftersom att DC-motorer drar på tok för mycket ström för att en Arduino ska klara av att driva dem direkt via sina pinnar behövdes en separat drivkrets för detta. Vi hade sedan tidigare en drivkrets av modell MC33926, av märket Pololu liggandes. Den klarar av att driva två motorer och kan leverera upp till 3A per motor. Den har dessutom en del mer avancerade funktioner, som exempelvis avläsning av strömförbrukning per motor. Dessa funktioner valde vi dock att inte använda. MC33926 kan styras genom två pinnar per motor, en för riktning på motorn, och en för hastigheten.

Hastigheten bestäms genom att sätta en PWM, där duty-cyclen bestämmer vilken hastighet motorn har. Eftersom vi hade ett fåtal GPIO-pinnar kvar att använda oss av valde vi att också installera fem lysdioder, som fick indikera att en användare hade taggat roboten. Eftersom att motorerna gärna matas med en spänning högre än 5V valde vi här att seriekoppla två power banks, för att få upp spänningen till 10V. Spänningsregulatorn på Arduinon klarar av att hantera spänningar upp till 12V, så detta kunde användas till att driva också resten av systemet. Om du var på festen kanske du noterade att Bishop blev lite ledsen efter en stund och tappade farten. Detta berodde på en rad anledningar, en haverikommission har satts in och är i full gång med att analysera problematiken, men mest sannolikt är det en kombination av ett par saker. Dels beror det på att en hel del smuts och hår kom in i maskineriet, vilket gjorde att motorerna fick svårare att snurra. Dels råkade ett par kablar hoppa ut vid ett tillfälle, och sattes eventuellt in felaktigt. Dels kan det bero på de powerbanks vi valde. För att garantera att batterierna inte skulle ta slut valde vi att använda två stycken powerbanks om vardera 20000mAh. Det verkar dock som att dessa var lite onödigt avancerade modeller, som innehöll någon typ av överspänningsskydd som slog aktiverades när vi seriekopplade de båda paketen till 10V.