2014年9月22日 星期一

安裝 ConfigObj

ConfigObj Library 可以幫您很容易存取 .ini 檔。

官網 https://pypi.python.org/pypi/configobj



下載

切換網頁到 https://pypi.python.org/pypi/configobj/5.0.6,點擊「Download」綠色按鈕。


安裝

解壓縮 configobj-5.0.6.tar.gz,開啟「命令提示字元」視窗,鍵入

cd \configobj-5.0.6

再鍵入

python setup.py install


參考網站

http://www.voidspace.org.uk/python/configobj.html#configobj-in-the-real-world









2014年9月19日 星期五

安裝 kivy - python for android

從現在起,您可以在 KIVY 架構下使用 Python 語言建立 Android App 了。
官網 http://kivy.org/#home


下載

https://github.com/kivy/python-for-android


教學影片

https://www.youtube.com/watch?v=F7UKmK9eQLY







2014年9月14日 星期日

將 Youtube 影片轉成音樂檔

步驟如下:

1. 先找到 youtube 影片。

2. 複製該影片的網址。

3. 切換網頁到 http://www.youtube-mp3.org/

4. 將影片網址貼到這兒。


5. 點擊「Convert Video」按鈕。
經過一會兒會出現類似下列畫面



6. 點擊藍色的「Download」按鈕。

2014年9月13日 星期六

安裝 wxGlade

wxGlade 是一個利用 wxPython 工具箱製作而成的使用者圖形介面建構器。目前,它也可以產生 Python、C + +、Perl、Lisp 和 XRC(wxWidgets的“XML資源)的使用者圖形介面代碼。

官網 http://wxglade.sourceforge.net/


下載

切換網頁到 http://sourceforge.net/projects/wxglade/,點擊螢幕中央的「Download」綠色按鈕。


安裝

雙擊 wxGlade-SAE-0.6.8-setup.exe,然後依照視窗指示進行即可。


教學

官網 http://wxglade.sourceforge.net/tutorial.php

程式語言教學誌 http://pydoing.blogspot.tw/2009/01/docsdemowxglade.html










2014年9月12日 星期五

Wyliodrin

Wyliodrin - 視覺化的樹莓派整合發展環境

官網 https://www.wyliodrin.com/


教學影片

Program Raspberry Pi Lesson 1: Switch a LED on and off by using a web browser

https://www.youtube.com/watch?v=YWLwUdkdWVE


Program Raspberry Pi Lesson 2: Show the likes from a Facebook page on two 7-segment displays

https://www.youtube.com/watch?v=qLnDilQtAzM


Program Raspberry Pi Lesson 3: Display sensor values on graphs.

https://www.youtube.com/watch?v=1K97q-Md7sA


Program Intel Galileo Gen 2 Lesson 4: Show sensors' value

https://www.youtube.com/watch?v=PapUdght_po&list=UUDe4G1RXRYsOEJzXHixutRA


Program Intel Galileo Gen 2 Lesson 5: Turn on/off the light with a relay and a light sensor

https://www.youtube.com/watch?v=PziZTtdeH5k&list=UUDe4G1RXRYsOEJzXHixutRA

安裝 Win32 Extensions

Win32 Extensions 提供一些讓您存取 Windows 作業系統的功能,例如讀取磁碟機資訊...等。
官網 http://starship.python.net/crew/mhammond/


下載

切換網頁到 http://sourceforge.net/projects/pywin32/files/pywin32/Build%20219/,點擊 pywin32-219.win32-py3.5.exe 。


安裝

雙擊  pywin32-219.win32-py3.5.exe ,然後依照視窗內的指示安裝即可。






2014年9月9日 星期二

安裝 PyKE

PyKE(Python Knowledge Engine) 是一個知識引擎套件,無論是正向鏈接或反向鏈規則(包括Python代碼)都可以被編譯成 Python,還可以自動組合成 Python 函數以外的程式,並且附加到反向鏈規則之中。

官網 http://pyke.sourceforge.net/


下載

切換網頁到 http://sourceforge.net/projects/pyke/?source=typ_redirect,點擊螢幕中央的「Download」綠色按鈕。


安裝

將 pyke-1.1.1.zip 解壓縮,開啟「命令列提示視窗」,鍵入 python setup.py install。










2014年9月4日 星期四

安裝 Visual Tkinter Python IDE

這是一個視覺化的整合操作環境,您可以用它來建立圖形化的使用者介面。


下載

切換至網頁 http://sourceforge.net/projects/visualtkinter/,點擊畫面中央的「Download」綠色按鈕。


安裝

解壓縮 Visual Python 2v0.12.2554.zip,雙擊 setup.exe,然後依照視窗指示進行即可。
安裝完成後會在桌面產生一個捷徑圖示,如下圖:


雙擊捷徑您就可以看到 Visual Tkinter 的整合介面,如下圖:









安裝 PythonCard

PythonCard 是一個以 wxPython 為基礎的使用者介面建構器。

官網 http://pythoncard.sourceforge.net/index.html


下載

切換網頁至 http://sourceforge.net/projects/pythoncard/files/,然後點擊淡藍色的 Download PythonCard-0.8.2.win32.exe (3.5 MB) 字樣。


安裝

快擊兩下 PythonCard-0.8.2.win32.exe,然後依照視窗指示安裝即可。


檢查是否已正確安裝

開啟範例檔案 <Python>\Lib\site-packages\PythonCard\samples\minimal\minimal.py 並執行它,如果有看到如下視窗表示已正確安裝。




查看所有的視窗工具

開啟範例檔案 <Python>\Lib\site-packages\PythonCard\samples\widgets\widgets.py 並執行它,您將可以看到如下視窗。


或是您也可以到這兒逐一檢視視窗工具有哪些:

http://pythoncard.sourceforge.net/samples/addresses.html

2014年9月2日 星期二

註解

註解是不會被執行的,為代碼加註說明是一件好的習慣,這些註解能夠讓您的程式更容易閱讀和維護。


單行註解

假設您有如下之代碼:

a = 5
b = 2
c = a + b
print c

您想把 c = a + b 這一行改成 c = a - b,但又不想把  c = a + b 這一行刪除掉,則您可以在該行前面加一個「 #」字元,如下:

a = 5
b = 2
#c = a + b
c = a - b
print c


註解區塊

假設您有如下之代碼:

a = 5
b = 2
print a + b
print a - b
print a * b
print a / b

而您想把一整個區塊的代碼做註解,則您可以在該區塊首尾各加一個「'''」字元,如下:

a = 5
b = 2
'''
print a + b
print a - b
print a * b
'''
print a / b




2014年9月1日 星期一

Python-Arduino-Command-API

Python-Arduino-Command-API 提供您另外一種方式讓 Python 與 Arduino 通訊。


下載

切換網頁到 https://github.com/thearn/Python-Arduino-Command-API,點擊右下角落的 Download ZIP 按鈕。


安裝

下載後解壓縮,然後開啟「命令提示字元」視窗,切換到你解壓縮後的路徑,鍵入

        python setup.py build install


範例

讓 Arduino 的 pin13 LED 閃爍。

Python Code

#!/usr/bin/env python
"""
 Blinks an LED on digital pin 13
 in 1 second intervals
"""

from Arduino import Arduino
import time

board = Arduino('9600') #plugged in via USB, serial com at rate 9600

while True:
    board.digitalWrite(13, "LOW")
    time.sleep(1)
    board.digitalWrite(13, "HIGH")
    time.sleep(1)

Arduino Code

#include <SoftwareSerial.h>
#include <Wire.h>
#include <Servo.h>
#include <EEPROM.h>

SoftwareSerial *sserial = NULL;
Servo servos[8];
int servo_pins[] = {0, 0, 0, 0, 0, 0, 0, 0};
boolean connected = false;

int Str2int (String Str_value)
{
  char buffer[10]; //max length is three units
  Str_value.toCharArray(buffer, 10);
  int int_value = atoi(buffer);
  return int_value;
}

void split(String results[], int len, String input, char spChar) {
  String temp = input;
  for (int i=0; i<len; i++) {
    int idx = temp.indexOf(spChar);
    results[i] = temp.substring(0,idx);
    temp = temp.substring(idx+1);
  }
}

void Version(){
  Serial.println("version");
}

uint8_t readCapacitivePin(String data) {
  int pinToMeasure = Str2int(data);
  // readCapacitivePin
  //  Input: Arduino pin number
  //  Output: A number, from 0 to 17 expressing
  //  how much capacitance is on the pin
  //  When you touch the pin, or whatever you have
  //  attached to it, the number will get higher
  //  http://playground.arduino.cc/Code/CapacitiveSensor
  //
  // Variables used to translate from Arduino to AVR pin naming
  volatile uint8_t* port;
  volatile uint8_t* ddr;
  volatile uint8_t* pin;
  // Here we translate the input pin number from
  //  Arduino pin number to the AVR PORT, PIN, DDR,
  //  and which bit of those registers we care about.
  byte bitmask;
  port = portOutputRegister(digitalPinToPort(pinToMeasure));
  ddr = portModeRegister(digitalPinToPort(pinToMeasure));
  bitmask = digitalPinToBitMask(pinToMeasure);
  pin = portInputRegister(digitalPinToPort(pinToMeasure));
  // Discharge the pin first by setting it low and output
  *port &= ~(bitmask);
  *ddr  |= bitmask;
  delay(1);
  // Make the pin an input with the internal pull-up on
  *ddr &= ~(bitmask);
  *port |= bitmask;

  // Now see how long the pin to get pulled up. This manual unrolling of the loop
  // decreases the number of hardware cycles between each read of the pin,
  // thus increasing sensitivity.
  uint8_t cycles = 17;
       if (*pin & bitmask) { cycles =  0;}
  else if (*pin & bitmask) { cycles =  1;}
  else if (*pin & bitmask) { cycles =  2;}
  else if (*pin & bitmask) { cycles =  3;}
  else if (*pin & bitmask) { cycles =  4;}
  else if (*pin & bitmask) { cycles =  5;}
  else if (*pin & bitmask) { cycles =  6;}
  else if (*pin & bitmask) { cycles =  7;}
  else if (*pin & bitmask) { cycles =  8;}
  else if (*pin & bitmask) { cycles =  9;}
  else if (*pin & bitmask) { cycles = 10;}
  else if (*pin & bitmask) { cycles = 11;}
  else if (*pin & bitmask) { cycles = 12;}
  else if (*pin & bitmask) { cycles = 13;}
  else if (*pin & bitmask) { cycles = 14;}
  else if (*pin & bitmask) { cycles = 15;}
  else if (*pin & bitmask) { cycles = 16;}

  // Discharge the pin again by setting it low and output
  //  It's important to leave the pins low if you want to 
  //  be able to touch more than 1 sensor at a time - if
  //  the sensor is left pulled high, when you touch
  //  two sensors, your body will transfer the charge between
  //  sensors.
  *port &= ~(bitmask);
  *ddr  |= bitmask;

  //return cycles;
  Serial.println(cycles);
}

void Tone(String data){
  int idx = data.indexOf('%');
  int len = Str2int(data.substring(0,idx));
  String data2 = data.substring(idx+1);
  int idx2 = data2.indexOf('%');
  int pin = Str2int(data2.substring(0,idx2));
  String data3 = data2.substring(idx2+1);
  String melody[len*2];
  split(melody,len*2,data3,'%');

  for (int thisNote = 0; thisNote < len; thisNote++) {
    int noteDuration = 1000/Str2int(melody[thisNote+len]);
    int note = Str2int(melody[thisNote]);
    tone(pin, note, noteDuration);
    int pause = noteDuration * 1.30;
    delay(pause);
    noTone(pin);
  }
} 

void ToneNo(String data){
  int pin = Str2int(data);
  noTone(pin);
} 

void DigitalHandler(int mode, String data){
      int pin = Str2int(data);
    if(mode<=0){ //read
        Serial.println(digitalRead(pin));
    }else{
        if(pin <0){
            digitalWrite(-pin,LOW);
        }else{
            digitalWrite(pin,HIGH);
        }
        //Serial.println('0');
    }
}

void AnalogHandler(int mode, String data){
     if(mode<=0){ //read
        int pin = Str2int(data);
        Serial.println(analogRead(pin));
    }else{
        String sdata[2];
        split(sdata,2,data,'%');
        int pin = Str2int(sdata[0]);
        int pv = Str2int(sdata[1]);
        analogWrite(pin,pv);
    }
}

void ConfigurePinHandler(String data){
    int pin = Str2int(data);
    if(pin <=0){
        pinMode(-pin,INPUT);
    }else{
        pinMode(pin,OUTPUT);
    }
}

void shiftOutHandler(String data) {    
    String sdata[4];
    split(sdata, 4, data, '%');
    int dataPin = sdata[0].toInt();
    int clockPin = sdata[1].toInt();
    String bitOrderName = sdata[2];
    byte value = (byte)(sdata[3].toInt());
    if (bitOrderName == "MSBFIRST") {
       shiftOut(dataPin, clockPin, MSBFIRST, value);
    } else {
       shiftOut(dataPin, clockPin, LSBFIRST, value);
    }
}

void shiftInHandler(String data) {
    String sdata[3];
    split(sdata, 3, data, '%');
    int dataPin = sdata[0].toInt();
    int clockPin = sdata[1].toInt();
    String bitOrderName = sdata[2];
    int incoming;
    if (bitOrderName == "MSBFIRST") {
       incoming = (int)shiftIn(dataPin, clockPin, MSBFIRST);
    } else {
       incoming = (int)shiftIn(dataPin, clockPin, LSBFIRST);
    }
    Serial.println(incoming);
}

void SS_set(String data){
  delete sserial;
  String sdata[3];
  split(sdata,3,data,'%');
  int rx_ = Str2int(sdata[0]);
  int tx_ = Str2int(sdata[1]);
  int baud_ = Str2int(sdata[2]);
  sserial = new SoftwareSerial(rx_, tx_);
  sserial->begin(baud_);
  Serial.println("ss OK");
}

void SS_write(String data) {
 int len = data.length()+1;
 char buffer[len];
 data.toCharArray(buffer,len);
 Serial.println("ss OK");
 sserial->write(buffer); 
}
void SS_read(String data) {
 char c = sserial->read(); 
 Serial.println(c);
}

void pulseInHandler(String data){
    int pin = Str2int(data);
    long duration;
    if(pin <=0){
          pinMode(-pin, INPUT);
          duration = pulseIn(-pin, LOW);      
    }else{
          pinMode(pin, INPUT);
          duration = pulseIn(pin, HIGH);      
    }
    Serial.println(duration);
}

void pulseInSHandler(String data){
    int pin = Str2int(data);
    long duration;
    if(pin <=0){
          pinMode(-pin, OUTPUT);
          digitalWrite(-pin, HIGH);
          delayMicroseconds(2);
          digitalWrite(-pin, LOW);
          delayMicroseconds(5);
          digitalWrite(-pin, HIGH);
          pinMode(-pin, INPUT);
          duration = pulseIn(-pin, LOW);      
    }else{
          pinMode(pin, OUTPUT);
          digitalWrite(pin, LOW);
          delayMicroseconds(2);
          digitalWrite(pin, HIGH);
          delayMicroseconds(5);
          digitalWrite(pin, LOW);
          pinMode(pin, INPUT);
          duration = pulseIn(pin, HIGH);      
    }
    Serial.println(duration);
}

void SV_add(String data) {
    String sdata[3];
    split(sdata,3,data,'%');
    int pin = Str2int(sdata[0]);
    int min = Str2int(sdata[1]);
    int max = Str2int(sdata[2]);
    int pos = -1;
    for (int i = 0; i<8;i++) {
        if (servo_pins[i] == pin) { //reset in place
            servos[pos].detach();
            servos[pos].attach(pin, min, max);
            servo_pins[pos] = pin;
            Serial.println(pos);
            return;
            }
        }
    for (int i = 0; i<8;i++) {
        if (servo_pins[i] == 0) {pos = i;break;} // find spot in servo array
        }
    if (pos == -1) {;} //no array position available!
    else {
        servos[pos].attach(pin, min, max);
        servo_pins[pos] = pin;
        Serial.println(pos);
        }
}

void SV_remove(String data) {
    int pos = Str2int(data);
    servos[pos].detach();
    servo_pins[pos] = 0;
}

void SV_read(String data) {
    int pos = Str2int(data);
    int angle;
    angle = servos[pos].read();
    Serial.println(angle);
}

void SV_write(String data) {
    String sdata[2];
    split(sdata,2,data,'%');
    int pos = Str2int(sdata[0]);
    int angle = Str2int(sdata[1]);
    servos[pos].write(angle);
}

void SV_write_ms(String data) {
    String sdata[2];
    split(sdata,2,data,'%');
    int pos = Str2int(sdata[0]);
    int uS = Str2int(sdata[1]);
    servos[pos].writeMicroseconds(uS);
}

void sizeEEPROM() {
    Serial.println(E2END + 1);
}

void EEPROMHandler(int mode, String data) {
    String sdata[2];
    split(sdata, 2, data, '%');
    if (mode == 0) {  
        EEPROM.write(Str2int(sdata[0]), Str2int(sdata[1]));  
    } else {
        Serial.println(EEPROM.read(Str2int(sdata[0])));
    }
}

void SerialParser(void) {
  char readChar[64];
  Serial.readBytesUntil(33,readChar,64);
  String read_ = String(readChar);
  //Serial.println(readChar);
  int idx1 = read_.indexOf('%');
  int idx2 = read_.indexOf('$');
  // separate command from associated data
  String cmd = read_.substring(1,idx1);
  String data = read_.substring(idx1+1,idx2);
  
  // determine command sent
  if (cmd == "dw") {
      DigitalHandler(1, data);   
  }
  else if (cmd == "dr") {
      DigitalHandler(0, data);   
  }  
  else if (cmd == "aw") {
      AnalogHandler(1, data);   
  }    
  else if (cmd == "ar") {
      AnalogHandler(0, data);   
  }      
  else if (cmd == "pm") {
      ConfigurePinHandler(data);   
  }    
  else if (cmd == "ps") {
      pulseInSHandler(data);   
  }    
  else if (cmd == "pi") {
      pulseInHandler(data);   
  }        
  else if (cmd == "ss") {
      SS_set(data);   
  }
  else if (cmd == "sw") {
      SS_write(data);   
  }
  else if (cmd == "sr") {
      SS_read(data);   
  }    
  else if (cmd == "sva") {
      SV_add(data);   
  }      
  else if (cmd == "svr") {
      SV_read(data);   
  }   
 else if (cmd == "svw") {
      SV_write(data);   
  }    
 else if (cmd == "svwm") {
      SV_write_ms(data);   
  }      
  else if (cmd == "svd") {
      SV_remove(data);   
  } 
  else if (cmd == "version") {
      Version();   
  }
  else if (cmd == "to") {
      Tone(data);   
  } 
  else if (cmd == "nto") {
      ToneNo(data);   
  }  
  else if (cmd == "cap") {
      readCapacitivePin(data);   
  }
  else if (cmd == "so") {
      shiftOutHandler(data);
  }
  else if (cmd == "si") {
      shiftInHandler(data);
  }
  else if (cmd == "eewr") {
      EEPROMHandler(0, data);   
  } 
  else if (cmd == "eer") {
      EEPROMHandler(1, data);   
  }  
  else if (cmd == "sz") {  
      sizeEEPROM();
  }  
}

void setup()  {
  Serial.begin(9600); 
    while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
}

void loop() {
   SerialParser();
}










the Micro Python board


Micro Python 控制板是由劍橋大學理論物理學家喬治·達米安(Damien George)所研發出來的, 它比 Arduino 更強大,比 Raspberry PI 更簡易,你只要將 Python 的程式貼到控制板內即可。

它提供一個 USB 接口,可以讓您連接電腦,因為它是屬於跨平台的,所以 Windows、Mac 或 Linux 作業系統都可以使用。

原文詳 http://www.wired.co.uk/news/archive/2013-12/06/micro-python







安裝 MySQL for Python

如果您想有計畫地處理大量資料,我想您需要一個資料庫軟體來處理這件事情,而 MySQL 就是最佳的選擇之一。

目前 MySQL 為 3.23 版,支援 Python 2.4~2.7 版,未來才會支援 Python 3.x 版。


下載

切換到下載頁 http://sourceforge.net/projects/mysql-python/?source=dlp,點擊綠色的 Download 按鈕。


安裝

雙擊 MySQL-python-1.2.4b4.win32-py2.7.exe,然後依照視窗內的指示進行安裝。


首先用 MySQL 建立一個含有溫濕度數據的氣象資料表,如下:

create table weatherData (
    weatherDataID int(11) AUTO_INCREMENT NOT NULL,
    humidity decimal(4,2) NOT NULL,
    tempC decimal(4,2) NOT NULL,
    constraint weatherData_PK primary key (weatherDataID)
);



Python Code

#!/usr/bin/python

import serial
import MySQLdb

#establish connection to MySQL. You'll have to change this for your database.
dbConn = MySQLdb.connect("localhost","database_username","password","database_name") or die ("could not connect to database")
#open a cursor to the database
cursor = dbConn.cursor()

device = 'COM5' #this will have to be changed to the serial port you are using
try:
  print "Trying...",device
  arduino = serial.Serial(device, 9600)
except:
  print "Failed to connect on",device

try:
  data = arduino.readline()  #read the data from the arduino
  pieces = data.split("\t")  #split the data by the tab
  #Here we are going to insert the data into the Database
  try:
    cursor.execute("INSERT INTO weatherData (humidity,tempC) VALUES (%s,%s)", (pieces[0],pieces[1]))
    dbConn.commit() #commit the insert
    cursor.close()  #close the cursor
  except MySQLdb.IntegrityError:
    print "failed to insert data"
  finally:
    cursor.close()  #close just incase it failed
except:
  print "Failed to get data from Arduino!"


uint8_t 是甚麼?

uint8_t 在 Arduino 裏相當於 byte。維基百科頁面 Stdint.h (http://en.wikipedia.org/wiki/Stdint.h) 有更多的信息。

基本上 Stdint.h 是 C\C++ 的檔頭,它是用來定義一些跨平台的資料型態。當您需要一些無正負符號的位元數值時,就可以使用它。例如:

void loop() {
uint8_t volume = Serial.read() - 'a';
....
}