Posts tonen met het label Python. Alle posts tonen
Posts tonen met het label Python. Alle posts tonen

06 april 2008

Python wordt mobiel!

Een tijd terug gaf ik op dit blog aan dat ik begonnen was met het programmeren in Python. Een tijd was er niets gebeurt, maar 2 maand terug heb ik het toch weer opgepakt. Het is me ondertussen gelukt een grafisch programma te schrijven met Python i.c.m. Tkinter en het werkt op drie systemen! Het werkt op Ubuntu, Windows en Wince en communiceert op alle platformen met de seriële poort. Omdat ik het het installeren van Tkinter en Pyserial nog niet zo makkelijk vond op de PDA hier even een klein receptje in de hoop dat ik daar nog een ander mee van dienst kan zijn. Overigens weet ik niet of dat de beste methode is, maar het werkt in ieder geval :). Installeren van Python lukte me, helaas, niet op mijn Ubuntu PC (geen verbinding met de PDA), daarom heb ik de installatie uitgevoerd via XP. Als Hardy straks uit is zal ik het nog eens opnieuw proberen via Ubuntu. Goed hier dan het recept!
  • Eerst downloaden we Python 2.5 van de Sourceforge pagina (klik hier om te downloaden). Ik heb ergens op internet gelezen dat je het beste de Smartphone editie kunt nemen, dus neem die maar! Download de setup.exe
  • Dubbelklik op het gedonwloade bestand en als er gevraagd wordt of er op het interne geheugen moet worden geïnstalleerd of op de flashcard kies dan intern geheugen.
  • Als het goed is, is Python nu op de PDA geïnstalleerd. Dit kun je testen door in Start > Programs > Python te starten. Je krijgt dan de Python Interpeter.

Nu gaan we naar het installeren van Tkinter. Dit is iets ingewikkelder, omdat er geen installatieprogramma voor is.
  • Download het volgende bestand tcltk8_4_12_ce-arm.zip
  • Open met een ziprogramma het bestand tcltk8_4_12_ce-arm.zip
  • Kopiëer de mappen bin en lib met ActiveSync naar de PDA
  • Verplaats op de PDA de map lib naar \Program Files
  • Kopiëer de inhoud van de map bin naar de map Windows

Als het goed is zou het nu moeten werken. We gaan dit nu even controleren. Open Python op de PDA Start > Programs > Python. Voer nu de volgende regel in:

import Tkinter

Als er geen er nu geen foutmeldingen komen is het gelukt! Als er wel wat fout gaat laat dan even en berichtje achter bij dit topic.

Tenslotte installeren we de bibliotheek voor seriële communicatie.
  • Eerst downloaden we de bibliotheek hier
  • Maak met Notepad een bestand met de volgende inhoud:

    \Program Files\Python25\ceserial

  • Sla het bestand op als ceserial.pth
  • Open de zipfile met een zipprogramma
  • Pak het zipbestand uit.
  • Wijzig de naam van ceserial.py in serial.py

De seriële bibliotheek heet op de PC serial.py en om er nu voor te zorgen dat we de programma's die we op de PC ontwikkeld hebben direct zonder wijzigingen kunnen gebruiken op de PDA wijzigen moet de naam van de bibliotheek op de PDA gelijk zijn aan die van de PC, vandaar het wijzigen van de naam.
  • Kopiëer nu de bestanden ui het zipbestand + ceserial.pth naar de PDA.
  • Maak op de PDA in de map \Program Files\Python25 een map ceserial aan.
  • Verplaats de bestanden die je zojuist naar de de PDA gekopiëerd hebt naar de zojuist aangemaakte map.
  • Kopiëer het bestand ceserial.pth naar \Program Files\Python25 (NIET VERPLAATSEN!)

Om te testen of de module goed geïnstalleerd is open we wederom Python. Type nu onderstaande code in:

import serial

Als er geen foutmeldingen zijn is het gelukt!

De bibliotheek werkt hetzelfde als die van Pyserial dus je kunt gewoon die documentatie gebruiken. Ik hoop dat ik je met deze post de twee weken zoek en prutswerk die het mij gekost heeft uitspaar.

Veel progammeer plezier!

07 juni 2007

Communiceren

Al een tijdje wil ik beginnen met het programmeren in Python. Waarom? Omdat je in Python een klein scriptje kunt programmeren, maar ook een heel complex programma. Maar ook omdat Python een programmeertaal die op allerlei platformen draait (Windows, WinCe, Linux, OSX, ...), dus als je eenmaal een programma maakt kan deze ook op het andere platform draaien. Leuk, denk je natuurlijk, maar we hebben al JAVA. Het voordeel van Python is echter de batteries included filosofie. Bij Pyhton worden allerlei bibliotheken geleverd voor allerlei taken. Voorbeelden zijn bibliotheken voor HTML, XML, TCP/ip, numerieke wiskunde, matrices, SDL... Je hoeft dus niet zelf allerlei moeilijk programmeerwerk te doen en je kunt je dus concentreren op het 'echte' werk. Ook kun je verschillende grafische bibliotheken gebruiken, zoals Qt, GTK, WxWindows, Tkinter.

De reden dat ik tot nu toe nog niet begonnen was met Python, komt omdat ik direct ook een nuttig programma wil schrijven en dan wel zie wat ik tegen kom. Op de eéń of andere manier kan ik me niet motiveren om 'stomme' oefeneningen te doen. Pas bedacht ik me dat Python misschien wel nuttig gebruikt kon worden voor m'n werk. Op m'n werk hebben de producten namelijk eigenlijk bijna allemaal elektronica aan boord. Ook hebben enkele producten een RS232 uitgang waarmee er met de computer gecommuniceerd kan worden. De combinatie van Python en RS232 leek me wel een leuke om mee te beginnen. Na wat gegrasduin (staat dit in de van Dale?) vond ik een bibliotheek voor het communiceren over de seriële poort. Deze bibliotheek zit ook al in Ubuntu, dus die was zo geïnstalleerd (even in Synaptic zoeken met zoekterm Python serial). Voor het programmeren zou het echter wel handig zijn om de data die beide richtingen door de seriële poort gaat te kunnen monitoren. Je kunt dan makkelijker zien of er iets mis gaat. Na veel zoeken vond ik op het Internet het programma Interceptty. Deze was helaas niet in een Deb verkrijgbaar, dus moest ik deze zelf compileren. *ahum* Ik ben niet zo goed in het compileren van software in Linux. Dit loopt bij mij meestal uit in een berg errors. Deze keer ging het echter van een leien dakje. Toen begon echter het probleem. Met welk commando start je nu interceptty zodat deze het dataverkeer van en naar de seriële poort monitoort? De voorbeelden die in het readme-bestand worden gegeven zijn niet van toepassing op mijn situatie en ik snapte ook niet goed hoe ik de parameters moest toepassen. Gelukkig kwam ik er uit na een dagje experimenteren, een nachtje slapen en weer opnieuw proberen:). Je moet namelijk het onderstaande commando gebruiken:

sudo ./interceptty -s 'ispeed 9600 ospeed 9600' /dev/ttyS0 /dev/serieel

Een beetje uitleg bij deze cryptische regel...
  • De snelheid waarmee gecommuniceerd wordt, wordt weergeven achter ispeeds en ospeed, waarbij ispeeds de ingaande snelheid is en ospeeds de uitgaande snelheid. In mij geval is de snelheid dus 9600 baud.

  • Mijn stukje hardware hangt aan de eerste (enige) seriële poort van de computer. De code hiervoor is /dev/ttyS0.

  • Je moet ook een 'poort' opgeven voor de software kant. Dit is een andere poort dan de seriële poort van de computer in. Het programmaatje zit als het ware tussen de fysieke seriële poort en je programma op de computer in. Daarom definiëren we voor de computerkant een softwarematige poort. Deze heb ik /dev/serieel genoemd, maar je mag zelf iets kiezen, dus /dev/eenhelelangepoortnaam is ook goed, maar niet zo bruikbaar.

Als je de regel hebt ingevoerd wacht het programma totdat er informatie voorbij komt. Je moet nu in Python de seriële poort openen en er naar schrijven. Ik heb daarvoor IDLE geopend. Met het volgende commando roep je de seriële bibliotheek aan en open je de seriële poort.

import serial
s = serial.Serial('/dev/serieel',9600,timeout=1)

Als je nu een commando naar de seriële poort schrijft zie je die in het terminal venster weer. Als je bijvoorbeeld onderstaande commando in python schrijft:

s.write('hoi')

dan zie je in het terminal venster het volgende verschijnen...

< 0x68 (h)
< 0x6f (o)
< 0x69 (i)

Als de hardware die aan de seriële poort dit nu begreep kreeg je een antwoordt. Aangezien ik geen hardware ken die dit commando kent gebeurt er niets. Als ik nu mijn stuk hardware neem en daar het volgende commando heen stuur

s.write("\x07\xf0\x00\x0f\x00\xbc\x07\x0f")

dan zie ik het volgende...

< 0x07
< 0xf0
< 0x00
< 0x0f
< 0x00
< 0xbc
< 0x07
< 0x0f
> 0x07
> 0xf3
> 0x07
> 0xf0
> 0x00
> 0x10
> 0x04
> 0x5b ([)
> 0x28 (()
> 0x28 (()
> 0x5b ([)
> 0xc7
> 0x07
> 0x0f


Alle regels die beginnen met < worden de seriële poort uitgestuurd (mijn commando dus). Alle regels die beginnen met > komen terug van de hardware die aan de seriële poort hangt. Mijn commandoregel ziet er een beetje raar uit. Maar als ik je vertel dat '\x07 staat voor een hexadecimale 7 dan begrijp je het misschien een beetje. Het is leuk dat er een commando terug komt, maar nu moet ik nog een programmaatje schrijven dat iets nuttigs doet. Hard aan het werk dus:)