středa 28. ledna 2015

PID regulátor

PID regulátor


Co je PID regulátor si můžete přečíst např. na Wikipedii. Pokud i po přečtení nebudete tušit, co PID je, zkusím napsat příklad trochu více lidsky:

P znamená proporcionální, I integrální a D derivační. Regulátor znamená, že něco reguluje, nejčastěji teplotu.
Takže stručně, jasně a zjednodušeně, jde o to, že máme například podlahové topení v domě a chceme PID regulátorem regulovat teplotu podlahy. PID proto, že nabízí nejlepší možnost regulování oproti P, PD nebo PI regulátorům.
Vždy potřebujeme spočítat chybu, resp. chyby. A nejlépe je, když je počítáme ve všech složkách (P, D a I).


P


P značí rozdíl mezi vstupní hodnotou a nastavenou požadovanou hodnotou

Pe = setpoint - input
Pout = Kp * E Kp je vlastně velikost chyby Kp = E


kde Pe - proporcionální chyba, setpoint - nastavená požadovaná hodnota, input - vstupní hodnota, Pout - velikost chyby, Kp - zesílení chyby, E - aktuální chyba

I


I značí integrál, neboli plochu pod křivkou. Je to vlastně chyba s časem. 

Ie = (ΣE + E) * t
Iout = Ki * ΣE Ki je vlastně plocha pod křivkou Ki = E * t



kde Ie - integrační chyba, ΣE je součet (suma) chyb předchozích, E - aktuální chyba, t - čas, Iout - velikost integrační chyby, Ki - zesílení integrační chyby

D


D značí derivaci, což je sklon křivky neboli změna chyby
De = (E - Elast) / t = (In - Inlast) / t
Dout = Kd * De Kd je vlastně sklon křivky Kd = E / t

kde De - derivační chyba, E - aktuální chyba, Elast - poslední známá chyba, t - čas, In - vstupní hodnota, Inlast - poslední známá vstupní hodnota, Dout - velikost derivační chyby, Kd - zesílení derivační chyby


Celkovou chybu spočítáme jako sumaci všech chyb:

OUT = Pout + Iout + Dout



Příklad 1 pro Walduino: (chybu určíme například 0.5)

// setup

t = 1000 ;                             // čas nastavíme na sekunduKp = 0.5;                              
Ki =  0.5 * t;                
Kd = 0.5 / t;                


// loop                                // smyčka vykonávající regulaci

nyni = millis(); // funkce millis vrací hodnotu v ms od spuštění programuzmena = (nyni – posledni);
if (zmena >= time change)
{   error = Setpoint – Input;                                      // výpočet E, neboli chyby
   errorsum = errorsum + error;   Derror = (Input – lastinput);
   Pout = Kp * error;                                              // jednotlivé chyby
   Iout = Ki * errorsum ;   Dout = Kd * Derror ;
   Output = Pout + Iout + Dout ;                                   // výsledná chyba
}
posledni = nyni;



Příklad 2 pro Walduino: (Trimr 200k (1GND, 2-A0, 3-PWM3), C 680uF (1-GND, 2-R), R 100R (1-C, 2-PWM3))


float Kp = .5 , Ki = .5, Kd = .5 ; // PID gain values
float Pout , Iout , Dout , OutputP, OutputI, OutputD, Output; // PID final ouput variables
float now , lasttime = 0 , timechange; // important time
float Input , lastinput , Setpoint = 127.0; // input-based variables
float error , errorsum = 0, Derror; // output of the PID components
int settime = 1000; // this = 1 second, so Ki and Kd do not need modification
void setup () {
  Serial.begin(9600); // serial setup for verification
  pinMode(3, OUTPUT);
} // end void setup (){
void loop () {
  now = millis() ; // get current milliseconds
  timechange = (now - lasttime); // calculate difference
  if (timechange >= settime) { // run PID when the time is at the set time
    Input = (analogRead(0) / 4.0); // read Input and normalize to output range
    error = Setpoint - Input; // calculate error
    errorsum = errorsum + error; // add curent error to running total of error
    Derror = (Input - lastinput); // calculate slope of the input
    Pout = Kp * error; // calculate PID gains
    Iout = Ki * errorsum ;
    Dout = Kd * Derror ;
    if (Iout > 255) // check for integral windup and correct
      Iout = 255;
    if (Iout < 0)
      Iout = 0;
    OutputP = Pout;
    OutputI = Iout;
    OutputD = Dout;
    Output = Pout + Iout + Dout ; // prep the output variable
    //Output = Pout; // prep the output variable
    if (Output > 255) // sanity check of the output, keeping it within the
      Output = 255; // available output range
    if (Output < 0)
      Output = 0;

    if (OutputP > 255) // sanity check of the output, keeping it within the
      OutputP = 255; // available output range
    if (OutputP < 0)
      OutputP = 0;

    if (OutputI > 255) // sanity check of the output, keeping it within the
      OutputI = 255; // available output range
    if (OutputI < 0)
      OutputI = 0;

    if (OutputD > 255) // sanity check of the output, keeping it within the
      OutputD = 255; // available output range
    if (OutputD < 0)
      OutputD = 0;

    lastinput = Input; // save the input and time for the next loop
    lasttime = now;
    analogWrite (3, Output); // write the output to PWM pin 3


    Serial.print ("Setpoint=");
    if (Setpoint < 100) Serial.print ("0");
    Serial.print (Setpoint); // print some information to the serial monitor
    Serial.print (" : ");
    Serial.print ("Input=");
    if (Input < 10) Serial.print ("0");
    if (Input < 100) Serial.print ("0");
    Serial.print (Input);
    Serial.print (" : ");
    Serial.print ("Output=");
    if (Output < 10) Serial.print ("0");
    if (Output < 100) Serial.print ("0");
    Serial.print (Output);
    Serial.print (" : ");
    Serial.print ("OutputP=");
    if (OutputP < 10) Serial.print ("0");
    if (OutputP < 100) Serial.print ("0");
    Serial.print (OutputP);
    Serial.print (" : ");
    Serial.print ("OutputI=");
    if (OutputI < 10) Serial.print ("0");
    if (OutputI < 100) Serial.print ("0");
    Serial.print (OutputI);
    Serial.print (" : ");
    Serial.print ("OutputD=");
    if (OutputD < 10) Serial.print ("0");
    if (OutputD < 100) Serial.print ("0");
    Serial.println (OutputD);

  } // end if (timechange >= settime)
} // end void loop ()

Popisovat program patrně nemá význam vzhledem k množství komentářů, které jsou v programu. Výsledkem je regulace PID regulátorem dle zadaného Setpointu a Vstupní veličiny.

Příklad 3 pro Walduino (využívá knihovnu PID_v1 a byl převzat z Arduino.cc)

/********************************************************
 * PID Basic Example
 * Reading analog input 0 to control analog PWM output 3
 ********************************************************/

#include <PID_v1.h>

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup()
{
  Serial.begin(9600); // serial setup for verification
  //initialize the variables we're linked to
  Input = analogRead(0);

  Setpoint = 100;

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  Input = analogRead(0);

  Serial.print ("Input=");
       if (Input < 10) Serial.print ("0");
     if (Input < 100) Serial.print ("0");  
  Serial.print (Input);
  Serial.print (" : ");
  
  myPID.Compute();
  analogWrite(3,Output);
  
  Serial.print ("Output=");
       if (Output < 10) Serial.print ("0");
     if (Output < 100) Serial.print ("0");  
  Serial.print (Output);
  Serial.println (" : ");
  delay(100);
  
}

Program funguje stejně jako výše popsaný.

čtvrtek 22. ledna 2015

Raspberry Pi jako Internetové rádio

Myšlenku použít Malinu jako internetové rádio mám od doby, kdy jsem si ji koupil.

Moje požadavky: přehrát dvě rádia, která poslouchám.
A to:

Samson:
mms://netshow5.play.cz/samsonfm128
http://icecast2.play.cz:8000/samsonfm128aac

Humor:
http://mp3stream4.abradio.cz/humor128.mp3

Žel, nepodařilo se mi jedním programem přehrát obě rádia.





Pro přehrání prvního streamu jsem použil MPLAYER


apt-get install mplayer                      - instalace programu MPLAYER

mplayer -playlist "mms://netshow5.play.cz/samsonfm128"         - přidání streamu do playlistu

amixer cset numid=3 1                     - nastavení výstupu pro přehrávání na sluchátka
amixer cset numid=3 2                     - nastavení výstupu pro přehrávání skrze HDMI











Pro přehrání druhého streamu jsem použil MPC a MPD

apt-get install mpc mpd                                                         - instalace MPC a MPD
mpc add http://mp3stream4.abradio.cz/humor128.mp3      - přidání adresy streamu
mpc play 1                                                                              - přehrání prvního streamu
mpc stop                                                                                 - ukončení přehrávání 


Poslech je paráda :) Teď už jen sehnat někde staré rádio, přidat ovládání skrze tlačítka či enkodér a dát Malinu dovnitř.






pondělí 19. ledna 2015

Raspberry Pi - užitečné příkazy

Seznam pro mě užitečných příkazů k Malině:


sudo <příkaz>   - provedení příkazu jako root
raspi-config       - konfigurace Maliny
apt-get update    - update Maliny  
apt-get upgrade  - upgrade Maliny
ls                        - výpis adresáře
cd ..                    - posun o adresář výš

Připojení flash disku:

- připojit flash disk k Malině
- odebrat mountlý disk
apt-get install fuse ntfs-3g                                - instalace ntfs-3g
mkdir /media/usbstick                                      - vytvoření adresáře pro flash disk
tail -f /var/log/messages                                   - zjištění názvu připojeného flash disku (sda1)
mount -t ntfs-3g /dev/sda1 /media/usbstick     - připojení flash disku do adresáře usbstick

GPIO

apt-get install rpi.gpio
apt-get install python-rpi.gpio

pátek 16. ledna 2015

Arduino + Krokový motor

Ze staré jehličkové tiskárny se ke mě dostaly dva krokové motory:

EM-93
Carriage Motor Specifications
Type                              4-phase 200-pole stepper motor
Voltage                          Driving: +36DC
                                     Holding: +5V DC
Coil Resistance              110 +/- 7% at 25°C per phase
Current                         Driving: 0.68A (max.)
                                     Hoding: O. 15A (typical)
Excitation                      1-2 phase, 2-2 phase




EM-50
Paper Feed Motor Specifications
Type                              4-phase 48-pole PM type stepper motor
Voltage                          Driving: + 36 VDC
                                     Holding: +5 VDC
Coil Resistance              780 +/- 3% at 25” per phase
Current                         Driving: 1.2 A (max.)
                                     Holding: 0.08 A(typical)
Excitation                     2-2 phase



Popis krokových motorů je pěkně popsán na stránkách: robotika , odkud jsem převzal obrázek zapojení. 
Propojit tyto motory s Arduinem pomocí tranzistorového pole ULN2803 bylo snadné a použití ukázkového programu přímo ze stránek Arduina také...

Schéma zapojení:

Ukázkový kód z Arduino Stepper motor

/* Stepper Unipolar Advanced
 * -------------------------
 *
 * Program to drive a stepper motor coming from a 5'25 disk drive
 * according to the documentation I found, this stepper: "[...] motor 
 * made by Copal Electronics, with 1.8 degrees per step and 96 ohms 
 * per winding, with center taps brought out to separate leads [...]"
 * [http://www.cs.uiowa.edu/~jones/step/example.html]
 *
 * It is a unipolar stepper motor with 5 wires:
 * 
 * - red: power connector, I have it at 5V and works fine
 * - orange and black: coil 1
 * - brown and yellow: coil 2
 *
 * (cleft) 2005 DojoDave for K3
 * http://www.0j0.org | http://arduino.berlios.de
 *
 * @author: David Cuartielles
 * @date: 20 Oct. 2005
 */

int motorPins[] = {8, 9, 10, 11};
int count = 0;
int count2 = 0;
int delayTime = 500;
int val = 0;

void setup() {
  for (count = 0; count < 4; count++) {
    pinMode(motorPins[count], OUTPUT);
  }
}

void moveForward() {
  if ((count2 == 0) || (count2 == 1)) {
    count2 = 16;
  }
  count2>>=1;
  for (count = 3; count >= 0; count--) {
    digitalWrite(motorPins[count], count2>>count&0x01);
  }
  delay(delayTime);
}

void moveBackward() {
  if ((count2 == 0) || (count2 == 1)) {
    count2 = 16;
  }
  count2>>=1;
  for (count = 3; count >= 0; count--) {
    digitalWrite(motorPins[3 - count], count2>>count&0x01);
  }
  delay(delayTime);
}

void loop() {
  val = analogRead(0);
  if (val > 540) {
    // move faster the higher the value from the potentiometer
    delayTime = 2048 - 1024 * val / 512 + 1; 
    moveForward();
  } else if (val < 480) {
    // move faster the lower the value from the potentiometer
    delayTime = 1024 * val / 512 + 1; 
    moveBackward();
  } else {
    delayTime = 1024;
  }
}

Program je jednoduchý. V podstatě jen čte hodnotu z potenciometru připojeného na Analogový vstup 0 a dle ní nastavuje směr a rychlost motoru. 
Popis bitových operací (posuvů) je pěkně popsán na: uart




A videoukázka s motorem EM-93 v šasi jehličkové tiskárny:












úterý 13. ledna 2015

Neoriginální FTDI převodník a aktualizace Win 7

Kdo firmu FTDI zná, jistě zná chip FT232 (převodník USB-Serial port). Jistě víte, že existují kopie tohoto chipu a možná se Vám stalo, jako mě, že od poslední aktualizace Win Vám přestal fungovat převodník s FT232... a pokud ne, může se stát později až aktualizujete Win.
Důvodem je použití klonu tohoto chipu v levných převodnících. Klon se od originálu fyzicky nijak neliší, pouzdro je shodné.
Více info zde:  http://zeptobars.ru/en/read/FTDI-FT232RL-real-vs-fake-supereal

Více info v diskuzích zde:
http://www.eevblog.com/forum/reviews/ftdi-driver-kills-fake-ftdi-ft232/
http://forum.arduino.cc/index.php?topic=270175.0

V poslední aktualizaci Win je nová verze ovladačů od FTDI a ty zjistí, že používáte klon a změní mu jeho PID na 0. Tím je pro Win nerozpoznatelný a přestává fungovat.

Zda se to stalo u Vašeho převodníku lze zjistit následovně:

Ve Win: Control Panel:System: Device Manager: Ports: right click on USB device:Properties: Details:Hardware IDs,
Good one shows this: ftdibus\comport&vid_0403&pid_6001
Counterfeits will have 0s instead I think. - a přesně tohle jsem našel ve svém PC.


Řešením je používat originál genuine převodníky od FTDI (drahé) nebo to obejít dle následujícího videa:
https://www.youtube.com/watch?v=LEpSCF-uqvs

Vyzkoušel jsem a funguje to.

LV

pondělí 12. ledna 2015

Automatické testování elektro zařízení pomocí RPi, kamery a OpenCV

Když vyrábím systémy ASTA, občas se při pájení stane, že není některý ze spojů zapájen správně. Často se to stává u pinů budiče segmentového displeje, někdy u LED diody, která indikuje alarm.
Napadlo mě udělat si inspekční systém, který bude kamerou snímat výrobek, na němž poběží test, a výsledkem bude, zda je některý ze segmentů displeje vadný.

Systém ASTAmini s teplotním čidlem
Sestavení: Malina s kamerou mířící na testovaný objekt

Po sestavení jsem si napsal krátký program v Pythonu (priklad_1.py) pro zjištění barev pixelů na pozicích se segmenty. Na ukázku simuluji vadné segmenty a, d, e na první číslici:

Simulace vadných segmentů na první segmentovce
Ukázka programu a výsupu

Výstup z progamu je tedy:


Bystřejší z vás napadne, co se stane když bude testovací zařízení v jiné poloze? Systém totiž v této jednoduché podobě pouze testuje pixely z obrázku. Samozřejmě by se dala vyrobit fixtura, která by testovací zařízení držela v jedné pozici, ale taky se dá detekovat např. hrana displeje a od ní pozici pixelů dopočítat. Nebo lze přímo detekovat segmenty, jak je vidět v následujícím obrázku:

Detekce segmentů (červené barvy) na zařízení. Připojovací kabely stejné barvy nejsou vhodné :)

Zajímavé je ovládání zařízení přímo z Maliny a tím spolupráce při vykonávání testů, ale to až příště...


Camera+PIR+Python - Detekce ptáků v budce včetně záznamu videa

Rozmýšlel jsem, jak zjistit, kdo nám chodí do budky na zrní, když jsem v práci... a tak jsem použil Malinu, kameru, PIR senzor a zaznamenávám fotky a videa z návštěv v budce.

Zapojení je následující (připojení k síti je zatím kabelem, do budoucna bude WiFi dongle):


Fotografie sestavy. Lze vidět Malinu s připojenou kamerou. Barevné kabely vedou k PIR senzoru a pípáku. 



Fotka budky, kde lze vidět (kromě krmiva) i PIR senzor "číhající" na návštěvy.


Fotky z kamery:





A videozáznam pro ukázku:




neděle 4. ledna 2015

SimpleCV + Python

Po instalaci SimpleCV přichází na řadu pár příkladů v Pythonu...

Příklad 1) Zobrazení obrazu z kamery a zjištění barvy určitého pixelu:







import subprocess
from SimpleCV import Image
import time


subprocess.call(“raspistill -n -w %s -h %s -o Obr_1.bmp” % (640, 480), shell=True)
img = Image(“Obr_1.bmp”)
img.show()
pixel = img[2, 2]
print pixel

Nejprve importujeme potřebné komponenty. Spustíme externí proces (raspistill) a uložíme snímek pod názvem Obr_1.bmp z kamery v rozlišení 640x480 pixelů. Do proměnné img načteme uložený obrázek a funkcí show ho zobrazíme. Funkcí img přistupujeme k samotnému obrázku. 

Výstupem je hodnota barvy na souřadnicích ve formátu: (153.0, 202.0, 199.0) 

V programu můžeme například onen pixel změnit na červený a upravený obrázek uložit pod názvem Obr_2.bmp takto:

img[2, 2] = (255,0,0)
img.save(“Obr_2.bmp”)
print pixel

Výsledkem je změna barvy pixelu na pozici x = 2, y = 2 (malá tečka na druhém obrázku). 



Příklad 2) Úprava obrázku funkcí binarize(), která převede obrázek do černobílé varianty.






#!/usr/bin/python
import subprocess
from SimpleCV import Image
import time

subprocess.call(“raspistill -n -w %s -h %s -o
 Obr3_1.png” % (640, 480), shell=True)
img = Image(“
Obr3_1.png”)
img.show()
time.sleep(5)
img = img.binarize()
img.show()
time.sleep(5)
macchie = img.findBlobs()
img.save(“
Obr3_2.png”)
img.show()
time.sleep(20)

Funkce binarize() má jeden parametr a tím je úroveň prahu, při kterém rozlišuje kdy bude pixel bílý a kdy černý. Hodnotu úrovně lze nastavit od 0 do 255. Ukázka hodnot 40, 100 a 200:

 
Funkce findBlobs() slouží k nalezení objektů, jejich orientace, tvar atp. Tyto parametry jsou důležité např. v robotice při vyhodnocení obrazu. Více v následující ukázce. 

Příklad 3) Hledání ploch, úhlů a středů v obrázku



U funkce binarize(40) jsem nastavil parametr na 40, aby nebyl výstup příliš dlouhý. Popravdě, není výstup příliš vhodný. Lépe by se vyhodnocoval obrázek s objekty na stole atp., kde by bylo vidět jednotlivé objekty, jejich plochy, orientaci a středy...

#!/usr/bin/python
import subprocess
from SimpleCV import Image
import time

subprocess.call(“raspistill -n -w %s -h %s -o Obr4_1.png” % (640, 480), shell=True)
img = Image(“Obr4_1.png”)
img.show()
time.sleep(5)
img = img.binarize(40)
img.show()
time.sleep(5)
macchie = img.findBlobs()
img.show()
time.sleep(5)
print “Areas: “, macchie.area()
print “Angles: “, macchie.angle()
print “Centers: “, macchie.coordinates()


Takže jsme prohledali obrázek a výstupem je:

Areas:  [  10.    10.5   13.5   27.5  136. ]
Angles:  [ 75.96375561  90.         -78.69007111  90.          90.        ]
Centers:  [[201 324]
 [200 308]
 [176 440]
 [596 361]
 [177 462]]

Výstup je zajímavý, ale trochu nepraktický. Lepší by bylo detekovat předmět dle barvy... resp. zda se daná barva na obrázku nachází včetně "příbuzných" barev, což jsou barvy trošku odlišné od referenční... a to bude v následující ukázce.

Příklad 4) Vyhledávání barvy z obrázku



#!/usr/bin/pythonimport subprocess
from SimpleCV import Color, Image
import time


subprocess.call(“raspistill -n -w %s -h %s -o Obr5_1.png” % (640, 480), shell=True)
img = Image(“Obr5_1.png”)
img.show()
time.sleep(5)
colore = (22,36,75)
blue_distance = img.colorDistance(colore).invert()
blobs = blue_distance.findBlobs()
blobs.draw(color=Color.BLACK, width=4)
blue_distance.save(“Obr5_2.png”)
blue_distance.show()
time.sleep(5)
img.addDrawingLayer(blue_distance.dl())
img.save(“Obr5_3.png”)
img.show()
time.sleep(5)





 Výsledkem je detekce modrých ploch. 

Příklad 5) Detekce hran  objektů

#!/usr/bin/python
import subprocess
from SimpleCV import Color, Image
import time

subprocess.call("raspistill -n -w %s -h %s -o Obr6_1.png" % (800, 600), shell=True)
img = Image("Obr6_1.png")
img.show()
time.sleep(2)

lines = img.findLines(threshold=150)
lines.draw(color=Color.RED, width=2)
img.save("Obr6_2.png")
img.show()
time.sleep(5)



U funkce threshold lze měnit úroveň rozpoznání. 





Příklad 6) Nalezení kruhů na obrázku

#!/usr/bin/python
import subprocess
from SimpleCV import Color, Image
import time

subprocess.call(“raspistill -n -w %s -h %s -o Obr6_1.png” % (640, 480), shell=True)
img = Image(“
Obr6_1.png”)
img.show()
time.sleep(5)
cerchi = img.findCircle(canny=250,thresh=200,distance=11)
cerchi.draw(color=Color.GREEN, width=4)
cerchi.show()
time.sleep(5)
cerchi = cerchi.sortArea()
cerchi[0].draw(color=Color.RED, width=4)
img_with_circles = img.applyLayers()
img_with_circles.save(“
Obr6
_2.png”)
img_with_circles.show()
time.sleep(5)





SimpleCV

SimpleCV je jednodušší OpenCV. Po úpravách spolupracuje s Raspberry Pi Camera Module (hurá).

Isntalace:
Po připojení kamery a její zprovoznění viz. https://www.youtube.com/watch?v=GImeVqHQzsE 
zaktualizujeme Malinu (všechny příkazy jako root samozřejmě):


apt-get update
apt-get upgrade
Vyzkoušíme, zda kamera funguje příkazem, který na 5 sekund zobrazí obraz z kamery:
raspistill ‐t 5000

Uložíme obrázek z kamery:
raspistill -vf -hf -o cam2.jpg

Obrázek je vertikálně (-vf) a horizontálně (-hf) otočený. 

Uložíme 10 sekundové video z kamery:

raspivid -o video.h264 -t 10000
Nainstalujeme potřebné doplňky pro Python:
apt‐get install ipython python‐opencv python‐scipy python‐numpy python‐setuptools python‐pip
Nainstalujeme SimpleCV:
pip install https://github.com/sightmachine/SimpleCV/zipball/master
Při instalaci se mi nenainstaloval svgwrite. Při pokusu o spuštění OpenCV se vypíše hláška o chybějící svgwrite. Proto ji nainstalujeme ručně:
pip install svgwrite 
Nyní vyzkoušíme spustit SimpleCV:
simplecv
Pokud je vše v pořádku, spustí se SimpleCV v konzoli. 

pátek 2. ledna 2015

RPi - zpomalení myši po aktualizaci

Po aktualizaci RPi se podstatně zpomalila myš a práce byla nepříjemná. Všechna nastavení myši byla neúčinná a pomohlo následující:

V adresáři /boot se nachází soubor cmdline.txt který je nutno otevřít jako Admin, čili spustit terminal jako root (ikonou z menu v Accessories/Root Terminal) a dostat se do adresáře pomocí cd /boot.

V adresáři doporučuji napsat ls pro zjištění, zda je soubor na místě. 

V souboru bude nějaké defaultní nastavení v podobě: 


dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait


Pomocí nějakého textového editoru např. mým oblíbeným je nano (takže v terminálu napsat nanoa za text v souboru připsat 


usbhid.mousepoll=0


Takže po změně bude soubor cmdline.txt obsahovat:


dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait usbhid.mousepoll=0


Potom soubor uložit (v nano stisknout Ctrl+O a přepsat stávající soubor).

Po restartu RPi už bude myš běhat jak má. 

čtvrtek 1. ledna 2015

Raspberry Pi a OpenCV

Aktualizováno: Po několika hodinách instalace OpenCV jsem přišel na to, že kamera, která je k RPi prodávána, není nativně OpenCV podporována a tudíž nefunguje... To je nemilé překvapení. Všechny levné USB kamery fungují. To je dobré vědět, hlavně před koupí kamery...

Při hledání řešení jsem narazil na SimpleCV, takže nyní experimentuji se zjednodušeným CV... 






OpenCV (Open Source Computer Vision) je C, C++, Python a Java multiplatformní interface pro práci s obrazem hlavně v reálném čase.

Hlavní stránka: http://opencv.org/
Dokumentace: http://docs.opencv.org/



Připojení kamery: https://www.youtube.com/watch?v=GImeVqHQzsE
Zprovoznění kamery: http://www.raspishop.cz/2013/08/kamera-pro-raspberry-pi/

Instalace OpenCV:

Nejprve aktualizace:
sudo apt-get update && sudo apt-get install build-essential cmake pkg-config python-dev libgtk2.0-dev libgtk2.0 zlib1g-dev libpng-dev libjpeg-dev libtiff-dev libjasper-dev libavcodec-dev swig

Stáhnutí OpenCV jako ZIP souboru:

wget http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.10/opencv-2.4.10.zip && tar unzip opencv-2.4.10.zip

Příprava balíku na kompilace

cd opencv-2.4.10 && cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_PERF_TESTS=OFF -DBUILD_opencv_gpu=OFF -DBUILD_opencv_ocl=OFF


Kompilace, která má běžet cca 5 hodin běžela asi 9 hodin!!!
make

Instalace
sudo make install

Nakonec ještě nějaké doplňky k Pythonu
sudo apt-get install python-pip && sudo pip install picamera && sudo pip install rpio

Nyní by mělo vše fungovat, ale nefunguje - viz aktualizace na prvním řádku. S USB kamerou by mělo být vše funkční. 
Zkusím vypátrat, jak s RPi kamerou připojenou přes port CSI...