Morse på pajen

Raspberry Pi med Lysdiod

Raspberry Pi med Lysdiod

Idag kom ett litet paket från lawicel. jag hade beställt en JTAG för arm, som jag inte tänker testa just nu och ett adapter-kort till Raspberry Pi, som byggsats. En hel del lödningar och testa att alla pinnar var som de skulle. Det är lite pilligt men tar man det lugnt och försiktigt så är det inte svårt. Sedan kopplade jag en lysdiod att testa alla pinnarna med. Vist var det mycket enklare med ett multiverktyg att kolla alla lödningar. Till slut fungerade all pinnarna. Efter som lödandet tagit lite tid fick det bara blir en enkel test. Hittade en beskrivning på ett morse skickade system.

kopplingsschema

Kopplingschema för diod och Pi

Det är en enkel koppling, ett motstånd mellan jord och en lysdiod, lysdioden till en GPIO pinne. Man kan sedan styra GPIO’pinnen med hjälp av ett litet program. Exemplet var i Python, för att komma åt GPIO registerna måste man dock köra som root. I alla fall på default installationen, jag kör Occidentalis, en variant av Raspberrian från Adafruit, på det kortet just nu.

Sedan tog jag morse exemplet på sidan ovan och gjorde några små omfaktureringar på det.

PieLed_bb

MORSECODEMAP = {
    ' ': ' ', "'": '.----.', '(': '-.--.-', ')': '-.--.-', ',': '--..--',
        '-': '-....-', '.': '.-.-.-', '/': '-..-.', '0': '-----', '1': '.----',
        '2': '..---', '3': '...--', '4': '....-', '5': '.....', '6': '-....',
        '7': '--...', '8': '---..', '9': '----.', ':': '---...', ';': '-.-.-.',
        '?': '..--..', 'A': '.-', 'B': '-...', 'C': '-.-.', 'D': '-..',
        'E': '.', 'F': '..-.', 'G': '--.', 'H': '....', 'I': '..', 'J': '.---',
        'K': '-.-', 'L': '.-..', 'M': '--', 'N': '-.', 'O': '---', 'P': '.--.',
        'Q': '--.-', 'R': '.-.', 'S': '...', 'T': '-', 'U': '..-', 'V': '...-',
        'W': '.--', 'X': '-..-', 'Y': '-.--', 'Z': '--..', '_': '..--.-'
}

def tomorseletter(letter):
    try:
        return MORSECODEMAP[letter.upper()]
    except KeyError:
        return ''

def morsestring(string):
    return " ".join( [tomorseletter(letter) for letter in list(string)] )

if __name__ == '__main__':
    import RPi.GPIO as GPIO
    import time

    def flash(len):
        GPIO.output(ledPin,GPIO.HIGH)
        time.sleep(len)
        GPIO.output(ledPin,GPIO.LOW)
        time.sleep(0.2)

    def dot():
        flash(0.2)

    def dash():
        flash(0.5)

    ledPin=17
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(ledPin,GPIO.OUT)

    while True:
        input = raw_input('What would you like to send? ')
        for symbol in morsestring(input):
            if symbol == '-':
                dash()
            elif symbol == '.':
                dot()
            else:
                time.sleep(0.5)

Göra det enklare.

6DA6DDC8-F395-4532-8A75-2EF035F50428 SnabbkopplingAtt koppla in displayen på kopplingsdäcket var ganska jobbigt.  Efter att ha tittat på lite pi till kopplingsdäck kom jag på att man skulle kunna göra skälv och få ihop det enklare. Fick tag på en hålplatta, och ett par stiftlister. Genom att bara löda på dessa och en massa korta sladdar fick jag en liten platta med 2×5 stift för displayen och 10 på en rad till kopplingsbordet. Det blev mycket enklare att koppla in och ur displayen.

Förutom att det var enklare, renare och gick åt mycket mindre sladdar på kopplingsdäcket var blev det samma Arduino program som igår.

Arduino, nu med knappar.

Kopplingsschema tryckknapp

Kopplingsschema tryckknapp

Att bara skriva ut tid är ju lite lite, det kan behövas lite mer. Till exempel att man tar emot två knappar, för föregående och nästa. Att koppla in tryck-knappar är lite speciellt. När man kopplar in inläsnings pinnar måste man se still att de har en fast potensial så att när de inte är intryckta spänningen är 0 volt. Det finns en artikel om hur man kopplar detta i början av Ardunio nybörjarkurserna.

Att koppla in detta extra i den förra uppkopplingen var ganska enkelt. Dock lyckades jag göra två små missar på koppligsdäcket och fick göra lite felsökning, först missade jag att dra över +5 till andra sidan, och dessutom satta jag ena tryckknappens plus på fel rad. Det gick i alla fall ganska fort att lösa sen biten.

Tryckknappar till Arduino

Tryckknappar till Arduino

För att kunna växla text med tryckknapparna behövs det betydligt mycket mer kod än tidigare. Jag börjar redan nu sakna ett lite mer kraftfullt språk, en smula objekt orientering och ett enkelt unit-test system. Programmet behöver nu i Setup() funktionen säga att de två pinnarna vi kopplat tryckknappar till skall vara indata. Samt att vi behöver sätta upp tre strängar. Det behöver vara minst tre för att man skall kunna skilja på nästa och föregående. I detta test exempel är det tre statiskt lagrade strängar i en array.

Dessutom behöver vi i loopen läsa ut om knappen är ned tryckt eller ej, detta sker men funktionen digitalRead(), jag har sedan skrivit en liten funktions för att samla koden som hanterar att knappen är nedtryckt. Att det blev en funktion är den bit av omfakturering från två nästan lika if-satser.

#include <LiquidCrystal.h>
// LiquidCrystal(rs, enable, d4, d5, d6, d7) e.g. Where the pins are on the Arduino
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int nextPin = 6;
const int prevPin = 7;
int nextLastState = LOW;
int prevLastState = LOW;
unsigned int textIndex = 0;
const int textExtries = 3;
char texts[3][30] = {
  { "blog.balp.nu/?p=540" },
  { "Hello World!" },
  { "12345678901234567890" }
};

void setup() {
  Serial.begin(9600);
  pinMode(nextPin, INPUT);
  pinMode(prevPin, INPUT);
  lcd.begin(20, 2);
  Serial.println("Setup()");
}

void buttonPressed(int state, int prevLastState, int change)
{
  if(state != prevLastState && state == HIGH) {
    if( textIndex == 0 && change < 0) {
      textIndex = textExtries+change;
    } else {
      textIndex = ( textIndex + change ) % textExtries ;
    }
    lcd.clear();
    Serial.println("buttonPressed()");
    Serial.println(textIndex);
  }
}

void loop() {
  String time = String(millis()/1000, BIN);
  lcd.setCursor(10 - (time.length()/2), 1);
  lcd.print(time);

  int nextButtonState = digitalRead(nextPin);
  int prevButtonState = digitalRead(prevPin);  

  buttonPressed(nextButtonState, nextLastState, 1);
  buttonPressed(prevButtonState, prevLastState, -1);

  nextLastState = nextButtonState;
  prevLastState = prevButtonState;
  lcd.setCursor(0,0);
  lcd.print(texts[textIndex]);
}

Arduino, Hello World.

Displayen igång och visar hello world

Displayen igång och visar hello world

Jag ville lära mig lite om GPIO på Raspery Pi:en.  Tanken var att koppla in en LCD-skärm som jag hittade in en låda hemma. När jag började gräva kunde jag inte hitta någon IDE-kabel utan ”key”. Så att det gick att få ut GPIO pinnarna på Pi’n från. Dock ville jag fortfarande lista ut hur LCD:n fungerade. Så jag tog fram min Arduino och använde den istället. Tittade runt lite och hittade ett program Fritzing, där man kunde göra kopplings schema och enkelt planera ett kopplingdäck.

De flesta LDC:er har ett liknade interface, ett Hitachi HD44780. Kollingen som behövs är.

LCD pin # Arduino Kommentar
VSS 1 Power GND Ground
VDD 2 Power +5v +5v
V0 3 Kontrast
RS 4 digital pin 12
R/W 5 ground
Enable 6 digital pin 11
D4 11 digital pin 5
D5 12 digital pin 4
D6 13 digital pin 3
D7 14 digital pin 2

Jag gjorde en layout i Fritzing för hur jag skulle koppla, som jag nu sedan modifierat lite med anpassningar för hur det blev givet att en del kopplingar fick göras med de sladdar jag hade tillgängliga, min ful inkoppling av flat-kablen till kopplingsdäcket.

Kollningsöverblick

Arduino till LCD

Det är definitivt petigt att få in LCD kablarna, det vore bättre att göra en konverter. Till Arduinon finns ett enkelt färdigt bibliotek för att programera mot denna typ av LCD:er. Från exemplet gjorde jag ett program som skrev url:en till detta inlägg, och under det en binär klocka med antalet sekunder sedan arduinon startades.

#include   <LiquidCrystal.h>
// LiquidCrystal(rs, enable, d4, d5, d6, d7) Where the pins are on the Arduino
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
    lcd.begin(20, 2);
    lcd.print("blog.balp.nu/?p=540");
}

void loop() {
    String time = String(millis()/1000, BIN);
    lcd.setCursor(10 - (time.length()/2), 1);
    lcd.print(time);
}
Att göra saker mer än en gång är jobbigt, Då är det dags att automatisera.

Förhands visning av GothPy, på torsdag

Att göra saker mer än en gång är jobbigt, Då är det dags att automatisera.

Att göra saker mer än en gång är jobbigt, Då är det dags att automatisera.

Detta är lite av det som kommer att komma på Torsdag med GothPy, jag kommer att prata om mitt lilla jul och Pi projekt bautomate. Bautomate har tre huvudsakliga syften. Hemautomatisering är coolt, Raspberry Pi, är en rolig liten leksak. Jag ville se om django var något att ha.

Raspberry pi är en...

Raspberry pi är en…

Raspberry Pi är en liten inbyggd ARMv6 (ARM11) dator, eller snarare ett utvecklingskort. Jag har model b, senare d.v.s 512Mb minne. Med tanke på vad de flesta andra utvecklingskort kostar är Pi mycket lätt att få tag på och bra prisvärd. Jobbar men man inbyggda arm system t.ex. Freescale i.MX arm är det inte stoprt steg till att köra pi. Pi är ett enkelt kort då allt ligger på ett vanligt SD kort. Något som också Freescale har men inte t.ex. Fujitsu. Det känns att Pi är anpassad för att användas av icke proffs hårdvaran är lite enklare, man det gör för mig att man kan koncentrera sig på mjukvaran för de inbyggda systemet. Än så länge har jag inte gjort något med egen hårdvara utana bara kopplat in saker på USB, Pi har dock gnake bra GPIO som på minner om andra system som Arduino.

Nexa enkla fjärrströmbrytare, Tellsidk en usb kollad fjärrkontroll bland annat till Nexa

Nexa enkla fjärrströmbrytare,
Tellstick en usb kollad fjärrkontroll bland annat till Nexa

För att styra ljusen hemma har jag köpt en del fjärrströmbrytare typ nexa. Detta är ett mycket enkelt och smidigt sätt att komma igång. Att sedan tre-pack för att koppa upp hemma är billigt gör det till ett trevligt system att jobba med för hemma bruk. Nexa’s har dock många nackdelar mot lite dyrare system. Tittar man på Zigbee eller zwave fungerat noderna som repeteras också. Brytarna kan rapportera om de är på eller av, och så vidare detta leder till ett mer robust system.

Tellstick är en fjärrkontroll till bland annat Nexa som kan styras från en dator. Tellstick har drivrutiner för linux som är Open source, det har via Python ctype kopplingar till Python. Detta gjorde det lämpligt att ha det som en grund till att styra allt från python. Att jag sedan kände för att prova på django gjorde detta till en trevligt mix.