arduino klockbox med dc motor [skiss]

En klockbox är ett påhittat ord som jag hittade på en svensk nätbutik som säljer det som på engelska kallas för watch winder. En klockbox syfte är att hålla en automatisk klocka vid liv medan den andra klockan sitter på armen. Med en automatisk klocka så menar jag ett mekaniskt armbandsur som vrider upp sig självt genom kombinationen av jordens dragningskraft och dina armrörelser. Detta är såklart ett lyxproblem för om man kollar på film så pratar de om att de ärvt klockor från släktingar och vissa har haft dem i generationer. Tekniken för automatiska klockor har funnits länge (wikipedia: ”The Geneva Society of Arts, reporting on this watch in 1777, stated that 15 minutes walking was necessary to fully wind the watch.”) men armbandsur blev vanliga först efter första världskriget. Vilket ger att problemet jag har funnits i nästan 100 år för dem som har mer än en automatisk klocka vilket kanske inte var så vanligt förr.

Spola fram tiden till nuläget nästan 50 år efter de automatiska klockornas storhetstid, dagens konkurrens och teknikutvecklingen så är prisbilden en annan. Däremot så är priset på en klockbox högt i relation till vad en automatisk klocka kostar. Jag vill kombinera mitt problem med att lära mig mer om att programmera och bygga den med en arduino som hjärta.

Som tur är så är båda mina automatiska klockor utrustade med samma urverk nämligen miyota 9015. Jag hittade på en klockboxtillverkars hemsida att deras produkt skulle ställas till 800 varv medurs per dygn för att vrida upp ett sådant urverk.

Kollar specifikationen på miyotas hemsida (länk till specifikationen). Det viktigaste jag kan utläsa därifrån är att uret vrids upp medurs sett från klockans baksida. Klockan ska kunna hålla tiden i minst 42 timmar fullt uppvriden. Om man har mätutrustning ska man kunna mäta klockans hälsa genom att sätta klockan i fyra olika lägen och mäta precision med datum upp, 6 upp, 9 upp, 3 upp i 10-60 minuter. Det är lite svårt att mäta med datumet ner antar jag för att man inte kan se visarna.

Så nu börjar informationsinhämtningen för hur jag ska styra en motor till att göra detta. Jag vet redan nu att det är PWM ingångarna som gäller.

Jag tänker mig att det blir i slutändan en ATtiny85 som sitter och utför arbetet för att göra det hela för att allt som ska ske är att en motor ska snurra ett visst antal varv per dag. Då jag bara har en typ av urverk att vrida upp så förväntar jag mig att jag med tiden inte kommer behöva ställa om den när den väl fungerar väl. Något jag skulle tycka vore häftigt är om det skulle gå att driva den på uppladdningsbara batterier och ha en solcell. Sen har jag sett ett antal smarta ideer där man drar igång motorn till att bara vrida 180° sedan så lossnar på något sätt så släpper motorn greppet och klockan kan hänga fritt i en liten stund och dingla in ett par extra halvdana snurr innan motorn drar igång igen. Jag antar att det har med att man sätter dit ett kugghjul som har ett hål i sig och då kanske det handlar om att använda en servomotor istället för att stanna i läget där hålutrymmet är.

Läs och förstå arduino kod

Som alla andra språk så behövs övning och det bästa sättet att lära sig är att prata med en urinvånare. Nu är mikrodatorer inte så pratsamma i början men det kommer. Jag kommer att gå igenom ett antal vanliga arduino program som du har stött på eller kommer att stöta på och stega igenom dem så grundligt jag kan. Kontakta mig ifall det är mer jag behöver gå igenom.

Läsa och förstå blink

Det absolut första programmet de flesta stöter på är ett blink  program (arduinos variant).

 

/*
Blink

Turns an LED on for one second, then off for one second, repeatedly.

Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
 it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
 the correct LED pin independent of which board is used.
 If you want to know what pin the on-board LED is connected to on your Arduino
 model, check the Technical Specs of your board at:
 https://www.arduino.cc/en/Main/Products

 modified 8 May 2014 by Scott Fitzgerald
 modified 2 Sep 2016 by Arturo Guadalupi
 modified 8 Sep 2016 by Colby Newman

This example code is in the public domain.
 http://www.arduino.cc/en/Tutorial/Blink
*/

// the setup function runs once when you press reset or power the board
 void setup() {
 // initialize digital pin LED_BUILTIN as an output.
    pinMode(LED_BUILTIN, OUTPUT);
 }

// the loop function runs over and over again forever
 void loop() {
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
    delay(1000);                       // wait for a second
    digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
    delay(1000);                       // wait for a second
 }

Språket c

Språket som används för att programmera arduino är c och ibland brukar jag skriva en variant av det då språket genomgår förändringar och det är valfritt att välja att gå vidare med exempelvis de förändringar som skett de senaste åren.

Vanligast nuförtiden är att utgå ifrån någon av C89/C90, C99 and C11. Siffrorna efter C står för årtiondet då specifikationen skrevs (C11 = 2011, C99 = 1999) så det är inget språk i förändring precis vars versioner kommer i nya betydande förändringar vart 10 år. Andra yngre språk som javascript förändras någorlunda radikalt varje år. Python är ett språk som börjat att lugna ner sig i stil med C.

Språket c i sig är bara ett språk. Språket saknar de bibliotek som behövs för att kunna skapa arduinospecifik kod. Biblioteken innehåller kod som ger språket vi använder specialord som underlättar att använda arudinon. Det är öppen källkod så om du vill så kan du delta i att förbättra biblioteken. Ofta är det rätt mastig kod men du lär dig massor om du skulle våga dig på att läsa det senare i livet.

Skrivnormer i programmering

Programmering är dialektalt och det finns massor av skrivna och oskrivna regler. Vilket betyder att när du läser kod så kommer det att se olika ut beroende på vem som skriver koden och vad de har för bakgrund eller pratar för andra språk. Oftast försöker man att skriva på engelska även om det absolut inte spelar någon roll för mikrodatorn vad variabler och funktioner kallas för (så länge du minns dem och de som läser förstår vad du mer).

När det gäller namngivning av variabelord, funktioner och så vidare så måste de skrivs utan mellanslag. Sätter du mellanslag i variabeldeklarationen tror kompileraren att du just skrivit två variabler efter varandra. I blinkprogrammet så kan du hitta:

  • digitalWrite()
  • pinMode()
  • LED_BUILTIN

Konventionen de första två kallas för camelCase vilket är vanligast att använda idag. Med camelCase skrivs första ordet med gemen sen därefter efterföljande ord inleds med versaler och då blir det som kamelryggar. Ibland så kommer du att stöta på en äldre konvention som ser ut som LED_BUILTIN men i så fall är det förhistoriska funktioner då de flesta av dem skrevs enligt skrönan att det inte fanns versaler och gemener representerade i datorer på den tiden.

Enkelradskommentarer // och flerradskommentarer /* */

Hela programmet börjar med en introduktionstext som bara är till för dig, dina medförfattare och kommer aldrig att läsas av datorn. Det är nämligen så att kommentarer skalas bort när du kompilerar koden till maskinkod.

Det vanliga förhållningssättet är att introducera programmet med en titel, en ide av vad det ska göra, vem du är och rättigheter. Det är de som du ser i flerraders kommentarerna som börjar med /* och slutar med */.

Det finns också en del enradskommentarer som är den text som följer efter två snedstreck på detta viset: //. Vi kan studera två varianter ifrån programmet.

// the loop function runs over and over again forever
void loop() {
    digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)

När du skriver kod själv så är det alltid rekommenderat att du skriver enkelradskommentarer med vad du förväntar dig att koden nedan ska åstadkomma ungefär som en rubrik. Sen för minnet så kan du efter ditt kommando skriva resultatet av vad raden gör precis som de gjort i kommentaren efter digitalWrite.

Så tar vi bort alla kommentarer så blir programmet bara några rader långt.

void setup() {
     pinMode(LED_BUILTIN, OUTPUT);
 }

void loop() {
     digitalWrite(LED_BUILTIN, HIGH);
     delay(1000);
     digitalWrite(LED_BUILTIN, LOW);
     delay(1000);
 }

Kommentarer är fruktansvärt behändiga i att studera och felsöka din kod. Ibland skriver du något som datorn inte förstår och då får du formulera om dig. Istället för att ta bort det som du just har ägnat en massa tid på att tänka ut så kan du kommentera bort det enkelt med att kommentera ut din kod som inte fungerar.

Funktionerna setup() och loop()

Om du studerar det som är kvar nu så är där två så kallade funktioner kvar med ett antal instruktioner. Du kan se att de är funktioner genom att de börjar med ordet void. Void är ett speciellt ord som ber kompileringen att vänta med att köra innehållet till det att funktionsnamnet kallas. Skriver ett hypotetiskt exempel:

// sätt en led på ett visst portnummer till high
void lampOn(int ledOnIOnumber) {
     digitalWrite(ledOnIOnumber, HIGH);
 }
 lampOn(13);
 lampOn(4);

lampOn() är en liten funktion som slår på en ledlampa på en viss siffra precis som i binkprogramets loop() finns en antal digitalWrite() men tänk om du ska slå på en hel massa ledlampor då kanske du vill skriva mindre och låta koden jobba åt dig. 

Du kommer att stöta på i framtiden att alla funktioner behöver köras precis som funktionen lampOn() här ovan. Med att köra menar jag att du skriver funktionens namn följt av ett kör (;). I koden så slår den på LEDs som är anslutna på 13 och 4. Smidigheten med detta är just det att funktionen kan användas flera gånger.

Nu kommer du kanske att tänka på något verkar udda med setup() och loop() om du tittar på exemplet ovan. Det har du rätt i för att setup() och loop() är specifikt utvalda för att skriva viss typ av arduinokod och körs alltid minst en gång oavsätt om du kör dem eller inte.

Av någon konstig anledning så ser det inte ut som att dessa gör det. Med att de inte verkar köras så är det för att en rad där det står setup(); eller loop(); och så är det för att underlätta att du kommer in i det som är viktigt.

Nu har ju tyvärr inte blink någon annan funktion som vi kan titta närmare på för att blinkprogrammet det är det absolut minsta programmet som du kommer att ha att göra med. Så det blir lite märkligt att just dessa beter sig annorlunda än alla andra funktioner. Men vi kan gräva vidare med vad vi har.

Funktionens objekt

Om du undrar vad måsvingarna {} är för för något så kallas de för objekt. Objekten är grundstenen i programmeringsspråket och skulle kunna ägnas väldigt mycket fokus på men jag ska försöka att hålla det till det väsentligaste.

Så om vi tar det med void setup() { så börjar objektet här och så avslutas det med den andra måsvingen }. Det är ett fantastiskt verktyg för att avgränsa innehållet i koden. Tittar du noga på koden så kommer du att se en viss indentering i början av raden då ett objekt börjar och ju högre i hierarkin som koden går desto större blir indenteringen. Vanligen är indenteringen fyra mellanslag eller en tab. Då tab används till en hel del annat i navigering av gränssnitt så har det sakta börjat att tyna bort samt en latare variant med bara två mellanslag börjat att komma fram.

void lampTwoOff() {
    // dubbelkolla att inte lampan redan är avstängd först
    if ( digitalRead(2) == HIGH ){
        // stäng av lampan
        digitalWrite(2, LOW);
    }
}

Ungefär som ovan kan det då se ut. Normalt så kan det bli ett antal fler nivåer. När det börjar bli ohållbart många (mer är sju tycker jag själv är helt oläsligt) så är det dags att bryta loss koden och skriva nya funktioner för att underlätta läsbarheten av koden.

Variabler, int och andra datatyper

Nu använder detta blinkprogramet en specialare i koden som ni kan läsa er till nämligen LED_BUILTIN. Det som döljer sig är en specialfunktion som själv listar ut beroende på vad kompileringen vet om din specifika hårdvara. I arduino uno och liknande så sitter det en inbyggd led på pin 13. C är ett så kallat typat språk vilket innebär att du behöver specificera vad det är för typ av innehåll som du kommer att fylla dina variabler med. Den allra vanligaste variabeltypen du kommer att hantera är int. int är kort för integer och står för ett 16-bitars heltal. Vilket betyder att det största talet är (2^15) -1 = 32767 och lika långt negativt. Ska du ha större tal så får du använda 32 bitars typen long.

Det är en strikt datamodell vilket innebär att du ska lagra rätt innehåll till rätt typ. Du måste alltså lagra siffror i en int och bokstav i en char annars så blir kompileringen ledsen. Med tiden kommer du att bli bekant och arbeta med flertalet andra datatyper. Om jag minns rätt så finns det ett trettiotal olika typer. Jag raddar upp några här som en lista och så får du lära känna dem på egen hand allt eftersom du behöver dem:

float, double, short, unsigned short, long, unsigned long, int[3]
char, unsigned char

Nu kommer den spännande biten för att precis som med funktioner så får du lov att kalla dina dataobjekt precis vad du vill så länge som de bara innehåller bokstäver och _ understreck. Om du minns exempelkoden jag skrev för att beskriva en funktion vars första rad såg ut såhär

void lampOn(int ledOnIOnumber) {

Så skapade jag en variabel där när jag skrev: int ledOnIOnumber. Nu vet du att en int normalt sett är ett tal mellan -32767 och 32767. Vilket är mer än väl lagom rymd för att skriva de få heltalen på en arduinos digitala ingångar som sträcker sig från 0 till 13. Nu kanske inte ledOnIOnumber var det tillsynes lättaste namnet att namnge sin variabel till.

Vänster och höger om likhetstecken

Återigen så avsaknad detta programmet likhetstecken men i alla extra exempel så har jag använt dem. Det fungerar som i matematiken.

int a = 1;

Grön till vänster och röd till höger. Det är nämligen så att det på den vänstra sidan skickas in till vänster. Du läser alltså från höger till vänster. Studera detta nedan.

int a = 2;
int b = 3;
a = b; // a blir då 3

Lägg märke till att du behöver bara skapa variabeln en gång. Gör du det två gånger så kommer kompileringen att bli ledsen.

Arduinos egna ordlista

Nu är du rustad så gott det går här och får läsa mer på egen hand. När du använder arduino IDE för att kompilera koden till maskinkod så använder du c i kombination med arduinos egna bibliotek. Det döljer sig en hel del kod bakom varje ord som är specifikt för arduino. Ett bibliotek är en samling av funktioner som är skrivna för de allra vanligaste metoderna att jobba mot exempelvis arduinot. Det första som man bör göra för att förstå ett bibliotek är att att studera vad det finns för ord. Genom att förstå dessa orden kan du göra precis allt utan att skriva avancerad kod. Det finns utförliga beskrivningar av allt som biblioteket innehåller på arduinos hemsida. Besök Language Reference documentation redan nu.

 

 

Hitta katten Viktor [prototyp 2]

Jag har skrivit om beskrivning av iden skrev jag hade av katthittaren i en tweet. ”I’m gonna build something for my cat so that I can find it quicker. Grabbing GPS position, sending it through radio and have another device for me to compare GPS distance on screen.”

Detta ska vara ett levande dokument som jag kommer att uppdatera allt eftersom att jag kommer längre med projektet.

Katthittaren

Problemet jag löser är att den ena av mina katter väljer att döva sina öron och bege sig på äventyr utomhus samt bestämma själv när det lämpar sig att komma tillbaka. Jag har vid några tillfällen lånat ut min gps klocka till katten så jag vet att radien som katten rör sig är upp till några hundra meter hemifrån och brukar komma tillbaka hemåt oftast en gång i halvtimmen för att kolla läget för att sedan bege sig längre bort.

Katthittare med arduino, gps och radio

2x arduinos av mindre format
2x radio things
2x gps things

Första iden med aruduno feather

Lagt denna iden åt sidan för att det kommer inte att fungera särskilt bra för att wifi är för dåligt räckvidsmässigt då katten rör sig på mycket längre avstånd. Radio är att föredra. Jag har ännu inga radioenheter. Feathern fungerar säkerligen utmärkt att använda men jag kommer att få koppla till någon radioantenn i så fall.

Spåra en katt från telefonen.

Ansluten till feathern

Testar komandon via screen.

screen /dev/ttyUSB0 9600

screen -ls

print(wifi)
romtable: 4023d018

Feathern

Text på enheten

ESP8226mod
AI-THINKER
ISM 2.4GHz
PA +25dBm
802.11b/g/n

På adafruits sida om feather produkten finns det lite mer info.

Hittat en radiofunktion som kör med en attiny:

http://www.instructables.com/id/Mini-weather-station-with-Attiny85/

Programmera ATtiny85 via en arduino

etta är en guide för att föra över kod till attiny från start till slut med tankar kring processen.

Vad du behöver är en arduino, en ATtiny, sladdar, fyra LED lampor i olika färger, resistorer som passar respektive LED och en Kondensator 10uF (eller 100uF och har du inte det så finns det andra mer komplexa lösningar att läsa om här).

Målet är att få igång ett vanligt blinkprogram på ATtiny85. Detta känns som absolut standard för alla arduino program och det är där man börjar innan man ger sig på mer avancerade projekt.

Det finns väldigt mycket om denna enhet och samtidigt väldigt lite. Anledingen till att det finns lite är för att det är upp till dig att inse att du kan ta de flesta projekt och sedan krympa ner det till ATtiny85:s formfaktor. Dessutom så är inte denna ATtiny ensam härre på teppan för mindre styr enheter utan ett av många olika val. I vårt fall så har vi valt dett chip för att det har ett gott ryckte och att den har en låg kostnad (<10kr per enhet). Länk till tillverkaren produktblad http://www.microchip.com/wwwproducts/en/ATtiny85. Produktbladet som hör till fån samma sida (pdf 3,7 MB).

Här finns det att läsa det mesta om enheten. https://github.com/SpenceKonde/ATTinyCore/blob/master/avr/extras/ATtiny_x5.md

x5 pin mapping

1 Förbereda arduinon

Eftersom att ATtinyn saknar de delar för att prata med datorn så är den vanligaste metoden att använda en arduino som programmerare. Alternativt en specifik enhet som man kan köpa som passar exakt det chip som man tänker programmera. Denna typ av enhet kallas för ISP vilket är kort för In-System Programming.

1.1 installera arduino som isp

Ladda upp exempelprogrammet till arduinon. I de flesta android IDEna finns ett antal exempel varav ett av dem heter Android as ISP.

I mitt fall är det en arduino uno som kommer att agera isp som jag för över detta programmet till.

Ställ in arduino/genuino uno
Porten exempelvis COM17 (brukar stå vilken som gäller)
Programemrare AVRISP mkII

1.2 Koppla in så att du ser hur ISPn arbetar

Följ exempelprogrammets instruktioner med att sätta in pins. Det är nämligen så att det finns tre stycken lampor som man kan koppla in för att se hur det går för programmeringen. Jag har citerat där det står nedan:

/ Put an LED (with resistor) on the following pins:
 / 9: Heartbeat - shows the programmer is running
 / 8: Error - Lights up if something goes wrong (use red if that makes sense)
 / 7: Programming - In communication with the slave

Förklaring för vad detta innebär. Heartbeat är för att visa att rätt program är igång och det ser man genom att lampan pulserar. En av lamporna visar om det går fel i processen. Den sista visar när kretsen programmeras och blinkar medan överföringen till ATtinyn via arduinon sker.

Ett tips när du kopplar in led lamporna är att använda jorden bredvid pinsen. Denna jord på arduino kortet är markerad med GND och är mellan pinhål 13 och pinhålet med texten AREF. Det finns tre sammanlagt stycken GND på kortet. Vilket kortar ner i alla fall en sladd.

1.3 koppla sladdarna mellan ATtinyn och arduinon

För att ATtinyn ska kunna få program från datorn behöver den kopplas in på ett speciellt sätt till arduinon. Följ dessa anvisningarna och titta på fotot samt illustrationerna som vägledning.

Sätt en 10 uF (eller 100 uF) mellan GND och RESET.

Koppla sedan upp attinyn med sladdar till de olika ingångarna så här. Där jag har illustrerat med pilar (->)  från attinyn vart respektive pin ska kopplas till för ingång på arduinon.

ATMEL ATTINY85 -> ARDUINO

                  +-\/-+
         D 10 <- 1|    |8  -> 5V
                 2|    |7  -> D 13
                 3|    |6  -> D 12
          GND <- 4|    |5  -> D 11
                  +----+

High low tech har gjort en fin illustration (om du är nyfiken har de även gjort en guide som går att läsa här på highlowtech. Tyvärr verkar deras verksamhet ha upphört).

Nu ska attinyn vara redo för att ta emot mjkvara via arduinon.

2.1 Ställ in arduinos IDE inställnigar

Öppna inställningsfönstret och fyll i följande

Kryssa i medelanden under uppladdnig.
Sätt varningar till standard.

Klistrar du in denna länken till ATtiny drazzy ATTinyCore: http://drazzy.com/package_drazzy.com_index.json

arduinoIdePreferences

2.2 installera attiny

Gå in i boarddsmanager.
Sök på attiny och klicka installera.

boardsManager

2.2.1 Tips på vart man hittar länkar om ovan inte fungerar

På arduinos hemsida länkar de till en lista med dessa jason filer för alla enheter som de känner till som det finns stöd för. Tänk på att ATtiny85 kallas även x5 och tillhör utbudet ATtinyCore. Går man in i variants i biblioteket för attiny hittar man att David A. Mellis har skrivit det mesta för just ATtiny85 och daterats till 2007 men många har gjort förbättringar som inte någon har tagit cred för.

https://github.com/arduino/Arduino/wiki/Unofficial-list-of-3rd-party-boards-support-urls

I mina efterforskningar hittade jag att den som är verkar som nuvarande huvudutvecklare för ATtiny heter Spence Konde och kallar sig Dr Azzy. Spence underhåller ATtinyCore som är en heltäckande samling av alla de senaste biblioteken för alla attiny chip. Den senaste versionen av ATtinyCore i skrivande stund är 1.1.4.

2.2.2 Cosa är ett annat alternativ

Jag vet inte vad Cosa är fullt ut men det är en person som har gafflat Dr Azzys arbete och gjort sin egna grej (öppen källkod ger sådana möjligheter). Cosa beskrivs som följande på deras hemsida Cosa is an object-oriented platform for Arduino. Får kolla in det en annan gång. Denna Mikael som är huvudutvecklare av denna tolkare verkar ha jobbat på ericsson länge. Om det har någon betydelse.
https://github.com/mikaelpatel/Cosa

Cosa: https://raw.githubusercontent.com/mikaelpatel/Cosa/master/package_cosa_index.json

 

3 Bränna bootloader

Chippet är ifrån fabrik instruerat hastigheten till 1 Hz. Vilket inte gör så mycket tycker jag. Det verkar vara ett krav att ”bränna” om den. De flesta väljer 8 Hz.

3.1 Bränn bootloaderinställningar

Det finns otroligt många alternativ. I arduino IDE välj från menyn. Samt Man bränner till internal.

Board: ATtiny25/45/85
Timer 1 Clock: CPU
B.OD.: B.OD. Disabled
LTO (1.6.11+ only): Disabled
Chip: ATtiny85
Clock: 8 MHz (internal)
Port: COM17 (eller vad du har för något just nu)
Programmer: Arduino as ISP

När allt ser ut så klicka på Burn Bootloader för att ”bränna” inställningarna.

arduinoIdeTools

4 Nu kan du skicka över skisser

Exempelvis blinkaren. Tänk på att ändra i exemplet med blinkaren till en port som finns på kortet D0-D5. Så om det står internal eller 13 så byt det till en siffra mellan 0 och 5 (på bilden kör jag med 3).

5 Andra alternativ

Här kommer nu sådant jag har sammanställt vad var inställningsmöjlighet innebär. Inställningarna för bootloadern som jag angav tidigare är inte satt i sten om man vet vad man gör. Jag har en del kvar att reda ut för att förstå allt själv. Min förhoppning är att du har nytta av detta för att kunna själv fortsätta utreda vad som kan förbättras.

5.1 Speciella Funktioner

Board: ATtiny25/45/85

Inga konstigheter.

Timer 1 Clock: CPU

Möjliga val Val att göra:
64MHz
32MHz
CPU (verkar vettigt men jag vet ej varför)

B.OD.: B.OD. Disabled

Finns frya val
B.O.D. Enabled (2.7v)
B.O.D. Disabled
B.O.D. Enabled (4.3v)
B.O.D. Enabled (1.8v)

B. O. D. står för brown out detect vilket på svenska blir uppmärksamma uppbränning. Jag skulle tolka det som en brandvarnare men jag kan ha fel. Det är märkligt att detta är frånslaget som standard nu när det kanske skulle vara bra att ha det tillslaget på något av lägena. Jag översätter rakt av från en engelsk text detta:

Brown-out detection övervakar kontinuerligt Vcc och är kopplat till chippets reset state (BOR) om strömmen går under ett visst läge. Det är en god ide för långsamt stigande nätaggregat eller när det är förväntat att strömmen kan falla under den mängd energi som krävs för att driva chippet på den frekvens den är ställd till. Med BOD frånslaget kan det hänga chippet till det att chippet manuellt återställs. BOD ökar strömförbrukningen något vilket kan vara dåligt för lågenergilösningar.

Studerar en alternativen 1.8v, 2.7v, 4.3v så undrar jag på vilket ”håll” som detta tillstånd för att de skulle agera som voltgränserna skulle slå igång. Jag skulle anta att exempelvis om en väljer 1.8v så slår reset igång när strömmen faller till 1.8v. Tänker man på det så står det inte specifikt så det skulle kunna innebära att när Vcc strömmen faller med 1.8v så utlöses reset. Jag har sett flimer där enheten kan trimmas ner till mycket liten energiförbrukning, till 0.2v och 0.01v. I sådana lågenergifall skulle en reset inte slås på eller kanske slås på i onödan av att strömmen går under den punkten direkt efter att strömmen slås till om en exempelvis har ett 3.7v batteri. Detta behöver utredas.

LTO (1.6.11+ only): Disabled

Jag undrar om versionen gäller arduino IDE. Det skulle betyda att man väljer disabled när man använder använder eclipse/atom men det verkar konstigt.

Val:
Enabled
Disbabled

Chip: ATtiny85

Inga konstigheter

Clock: 8 MHz (internal)

Det är viktigt att välja internal för external i det här fallet är arduinon vilket blir en missmatchning som kan kanske orsaka att något går snett. Är det ett projekt som ska hålla tiden med watchdog så har jag sett att 16 Hz använts. Kan vara det här man ändrar om man har någon speciell kristall som jag läst om i förbifarten.

Internal:
8 MHz
1 MHz
16 MHz (PLL clock, x5, x61 only)

Det är konstigt att 20 MHz inte finns med men det står med i specifikationerna för kortet men det skulle kunna vara så att det kommer när väl någon har lyckats att skriva in det i biblioteket. För alla funktioner som är här kommer ju ATtinyCore.

Port: COM17 (eller vad du har för något just nu)

Välj den som passar bäst. På linux är det exempelvis oftast /dev/ttyACM0

Programmer: Arduino as ISP

Inga konstigheter

5.2 Hintar mumbo jumbo

I specifikationerna kan man läsa om stöd för en del andra funktioner. Men de är inte valbara vad jag kan se i menyerna. Dessutom så ligger de utanför mitt kunskapsområde. Jag har med dem för att om jag en dag förstår dem eller uppdaterar denna guide när biblioteken uppdaterats att innehålla dessa.

I2C i kombination med hårdvaru USI i Wire biblioteket. Oklart vad det är för något.

Stöd för SPI genom biblioteket. USI jobbar med DI/DO i mastermode. Fungerar tydligen ej med MISO/MOSI. Slavläge är DI MOSI och DO MISO. Undar om de har skrivit fel och DI samt DO är D 0 respektive D 1 pinsen.

Seriell support via mjukvara. Använd interrupts. TX är AIN0, RX är AIN1. Det står att en får tänka på att kommandot Serial.begin() gör dessa pins oanvändbara för annat. Dessutom ska man tänka på att det blir fel om man läser och skriver samtidigt vilket betyder att det är någon sorts envägskommunikation med mjukvaru seriell kommunikation (”the usual SoftwareSerial library” står det).

För att seriell mjukvarukommunikation ska fungera bra kan en behöva kalibrera den interna oscilatorn eller pll klockan (det finns sketcher för detta). Det har att göra med att klockan är kalibrerad till +/- 10% i de flesta fall medan seriell kommunikation bara fungerar med ett fåtals procents avvikelse.

6. Andra resurser om detta

Genomgående har jag refererat till ett antal andra som du kan gå tillbaka till och läsa mer i.

Vill du se film så rekomenderar jag denna: https://m.youtube.com/watch?v=c8andV3OWr8

Tre i rad med arduino adafruit [skiss]

Iden är att göra ett fyra i rad spel med pixellampor och tryckknappar. Samtidigt som jag går igenom hela processen av att genomföra projektet så kommer jag att dokumentera så mycket som möjligt för att göra någon typ av hänvisning för framtida projekt. I projektet har jag också till uppdrag att utreda vad det finns för utvecklingsmiljöer.

Hårdvaran som jag har att tillgå är en adafruit flora, en adafruit gemma, passande 3.7V 400mAh batteri och 3.7V batteriladdare. En adafruit neopixel ring, ett antal adafruit flora neopixel. Diverse tryckknappar, sladdar. Det är inte meningen att jag ska använda allt men det formade iden för vad jag kan göra.

Beskrivning av Tre i rad spelet

Spelarna ska kunna turas om att lägga och flytta sina pjäser till det att spelet är över.

När man har valt 3 stycken lampor var så börjar ett strategist spel där man flyttar från det ena till det andra. Man klickar då på platsen man vill flytta ifrån till den nya platsen. Till det att en spelare har fått tre i rad.

Spelaren vars tur det är ska dens lampor ska blinka. Det kan vara så att första brickan läggs ut slumpmässigt för att göra spelet intressantare.

När man flyttar en av sina lampor ska man klicka först på den som man ska flytta och sen på en tom plats på brädet. En ogiltig plats avbryter draget och spelaren får välja om.

Teoretiskt schema över spelet där 0 betyder tom, x är spelare 1 och y är spelare 2 (som har segrat).

0 x y
0 x y
x 0 y

Adafruit flora

Drivrutiner till windows hämtas på: https://github.com/adafruit/Adafruit_Windows_Drivers/archive/master.zip

https://learn.adafruit.com/adafruit-arduino-ide-setup/windows-setup

arduino projekt 02 samt 03

Går igenom boken arduino projects book som följer med arduino starter kit igen. För något år sedan gjorde jag alla övningar (2015) och skrev en handledning till det femte projektet då. Jag tyckte att boken var bra för att den gick igenom var komponent.

Projektet ska föreställa en rymdskeppspanel. Genom att trycka eller hålla inne en knapp så ändras lamporna. Alla komponenter är kopplade separat från varandra på vars en digital ingång.

Konstigt nog så upplever jag att koden ger ett annat resultat än vad de skriver i boken. Det är säkert korrigerat i nyare böcker. Gröna lampan ska lysa i ursprungsläget och sen släckas samtidigt som de röda led-lamprona blinka om vartannat när man trycker på knappen.

int switchState = 0;

void setup() {
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(2, INPUT);
 
}

void loop() {
 switchState = digitalRead(2);

if (switchState == LOW) {
 digitalWrite(3, LOW);
 digitalWrite(4, HIGH);
 digitalWrite(5, HIGH);
 
 }

else {
 digitalWrite(3, HIGH);
 digitalWrite(4, LOW);
 digitalWrite(5, HIGH);

delay(250);

digitalWrite(4, HIGH);
 digitalWrite(5, LOW);

delay(400);
 }
}

Så ser min kod för att det ska fungera rätt. Något kanske växlar LOW och HIGH jämfört med hur boken är skriven. Jag har testat koden på två olika arduino Uno enheter och får rätt resultat var gång.

Samma sak gäller då projekt 04 att HIGH betyder att lampan är av. Koden jag skrev för projekt 04 loveMeter kanske inte kan användas rakt av. Jag har behållit lamporna på samma plats som i projekt 03 och därför ser koden annorlunda ut. Kolla in for loopen i koden och vart pinsen är deklarerade så syns det jämfört med boken.

const int sensorPin = A0;
const float baselineTemp = 20.0;
void setup() {
 Serial.begin(9600);
 for(int pinNumber = 3; pinNumber <6; pinNumber++){
 pinMode(pinNumber, OUTPUT);
 digitalWrite(pinNumber, HIGH); // HIGH släcker lampan
 }
}

void loop() {
 int sensorVal = analogRead(sensorPin);

Serial.print("Sensor Value: "); // + sensorVal);
 Serial.print(sensorVal);

float voltage = (sensorVal/1024.0) * 5.0;

Serial.print(", Volts: ");
 Serial.print(voltage);

Serial.print(", Degrees C: ");

float temperature = (voltage - .5) * 100;
 Serial.print(temperature);
 Serial.println();




if(temperature < baselineTemp){
 digitalWrite(3, HIGH);
 digitalWrite(4, HIGH);
 digitalWrite(5, HIGH);
 } else if(temperature >= baselineTemp+2 && temperature < baselineTemp+4){
 digitalWrite(3, HIGH);
 digitalWrite(4, HIGH);
 digitalWrite(5, LOW);
 } else if(temperature >= baselineTemp+4 && temperature < baselineTemp+6){
 digitalWrite(3, HIGH);
 digitalWrite(4, LOW);
 digitalWrite(5, LOW);
 } else if(temperature >= baselineTemp+6){
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
 digitalWrite(5, LOW);
 }
 delay(1);
}

Jag går mest igenom grejerna för att få en känsla för koden så jag har inte lagt någon energi på hur den ser ut. Det var lätt att ställa in serial monitorn i eclipse. Jag la också till en Serial.println(); för att få en ny rad istället för att avläsningsdatan springer oläsligt i sidled som den gör i boken istället för neråt. Det skulle utan tvekan gå att optimera koden till bara en Serial.println() istället för sju printsatser.

Lampan lyser för att temperaturen i rummet är tillräckligt hög (+22 grader C).

arduino bokens projekt 05 av 15

Projektet kommer från Arduino projects book som följer med arduino starter kit. Detta är det femte projektet som heter mood cue.

Koden i denna var lätt (enligt mig). Däremot är den aningen lurig att konstruera i och med att komponenterna i illustrationen skiljer sig från de jag har i mitt paket. Här är hur jag löste det ifall du skulle fastna så kan du se om detta är till någon hjälp.

  1. Motorn är annorlunda än i illustrationen och därför ska du koppla annorlunda än i manualen!
    Se till att du har rätt med GND, signal och 5V. Det står på motorn i mitt fall vilken som är vilken men jag tog också tipset från att i instruktionen så står det att den svarta är GND (ground eller jord på svenska). Se till att de är rätt så att motorn mår bra (jag kopplade först som i manualen innan jag såg det och då vibrerade den konstigt så att jag fatta att något var fel).
    image
  2. Dimmern kräver ett mycket större område än vad den gör i manualen.
    Jag förlängde hela brädet för att kunna göra det möjligt för den att få plats. Vart du placerar den är upp till dig men du börjar att ana att det finns fler möjligheter.
    image

Så var uppmärksam för att de komponenterna du har kan skilja sig och var kreativ för att lösa de problemen som uppstår av att illustrationen inte stämmer (ritningen stämmer såklart för att den är komponentoberoende). Var glad.