2015年5月25日 星期一

Bluetouth Joystick on RPi2 (Python)

網路上找到一個有趣的一段程式碼

import subprocess
import pygame
pygame.init()
ps3 = pygame.joystick.Joystick(0)
ps3.init()
while True:
  try:
      pygame.event.pump()
      buttons = [ps3.get_button(0),ps3.get_button(1),ps3.get_button(2),ps3.get_button(3),ps3.get_button(4),ps3.get_button(5),ps3.get_button(6),ps3.get_button(7),ps3.get_button(8),ps3.get_button(9),ps3.get_button(10),ps3.get_button(11),ps3.get_button(12),ps3.get_button(13),ps3.get_button(14),ps3.get_button(15),ps3.get_button(16)]
      axis = [ps3.get_axis(0),ps3.get_axis(1),ps3.get_axis(2),ps3.get_axis(3)]
      print(buttons)
      print(axis)
      subprocess.call("clear")
   except KeyboardInterrupt:
      print("Exiting")
      raise

首先先將Bluetouch搖桿與RPi2連線,目前我是使用startx的方式,以圖形介面的方式去操作抓到藍芽週邊.希望有文字模式的操作方法.有空再研究
確定手把連線後.接者使用python執行這段描述.
針對Button的這個矩陣.總共會有16個參數.對應axis這各參數總共有4個參數.
目前針對WAMO Pro這隻藍芽手把抓到的位置對應為
Button=[A,B,BL,X,Y,BR,LB,RB,LT,RT,LA,RA,0,0,0,0]
Axis=[LX-,LX+,LY+,LY-,RX-,RX+,RY+,RY-]
X-min=-1;
X+max=999969482421875
Y-min=-1;
Y+max=999969482421875
這樣看來Axis為類比訊號.
Button只有On/Off的1 or 0差異.
這樣子藍芽手把可以當作搖控的設備了.現在已經知道python與手把的對應關係了.
要弄出一部藍芽遙控車也不是不可能了.
萬事不具,更欠東風啊…神啊~請賜給我一個車體基盤,加上一個L298N馬達驅動版吧..
我的霹靂車計畫就可以開動.
霹靂車,尖端科技的結晶,是一部人性化的萬能電腦車。笑~~~

2015年5月24日 星期日

RPi2安裝BlueTooth

參考網站
http://www.correlatedcontent.com/blog/bluetooth-keyboard-on-the-raspberry-pi/
http://ruten-proteus.blogspot.tw/2014/07/Bluetooth-Kit-tutorial-01.html
簡單的整理一下指令如下
1. 安裝Bluetooth:
sudo apt-get install -y bluetooth bluez-utils blueman
2. 確認狀態:
/etc/init.d/bluetooth status
3. 搜尋裝置:
hcitool dev => 檢查藍芽接收器是否正常
hcitool scan => 搜尋接收器附近的裝置
4. 如果認不到藍芽…
需要打開 etc/group 檔案,並增加使用者 pilp 群組後面

5. 補充說明Shell狀態下將藍芽週邊連線
首先要有安裝
sudo apt-get install bluez python-gobject
如無法安裝,需要將dbus定義為default
sudo update-rc.d -f dbus defaults


先用hcitool scan 搜尋
以我的藍芽搖桿為利,發現有 00:17:02:01:1E:74   WamoPro


利用下載到的bluez-的tool來協助安裝 (沒想到竟然這程式是用python寫的)
bluez-simple-agent hci0 00:17:02:01:1E:74   
        => 第一次連線時需要輸入,成功時會詢問週邊密碼,大多為0000


但輸入密碼後,還是無連線,因為剛剛的動作只是將藍芽週邊作一個登記
實際要連線要使用以下指令
bluez-test-input connect 00:17:02:01:1E:74  yes


接著繼續定義為可信任裝置,這樣就搞定了.
bluez-test-device trusted 00:17:02:01:1E:74   yes


如果是常用的藍芽周邊建議是, 就寫好一個script.以後就不用打太多字了.
Ex: wamopro.sh
bluez-test-input connect 00:17:02:01:1E:74  yes
bluez-test-device trusted 00:17:02:01:1E:74  yes


未來只要執行 sh wamopro.sh 就可以搞定了

2015年5月21日 星期四

4WD智能車 平台比較

哈爾濱有家公司 做了一些產品…看起來還頗有那麼一回事.
以下兩個價錢差很多…好想買越野版的 但價格差200rmb…
T27MhJXeBbXXXXXXXX_!!94851079 T2BvItXbBbXXXXXXXX_!!94851079
T29ypEXaFXXXXXXXXX_!!94851079 T2bPE3XftaXXXXXXXX_!!94851079
T2zfqDXotbXXXXXXXX_!!94851079 T2aq9EXd8aXXXXXXXX_!!94851079
網路上有看到一個坦克車底盤…
TB2NdFmbFXXXXaUXpXXXXXXXXXX-544675804
這不就是WALL E嗎?….喔~~我又猶豫了.
11ebebbfdb3f5ec4f5d1b76f9f69fcc418354_107629599253142_100000183068023_201290_8327020_n

2015年5月5日 星期二

Language C on Raspberry


1.習慣C/C++的朋友們
2.感覺python的運作比較慢.
可能就會開始思考有沒有C的選擇在Raspberry Pi上.
這答案是肯定的
RPi使用的是bcm2835, 的確是有相關的現成資料庫可用
http://www.airspayce.com/mikem/bcm2835/
但RPi2是bcm2836…這下就不知道了.
如討論到速度.還真的有高手在比較RPi的執行速度
http://codeandlife.com/2012/07/03/benchmarking-raspberry-pi-gpio-speed/
但Table上顯示,其實python表現不俗.
C:22MHz
Python:70MHz => 這是直接使用RPi.GPIO的表現.
Python:28MHz => 這是透過API的表現.
就數字上python的執行速度不差,看來我覺得慢的原因是?
推測是使用GrovePi有透過多次的API包覆.雖查看Grov底層的控制,也是RPi.GPIO,
但感覺上總覺得慢了點,難道是程式碼沒改成pyc的方式.

Google查了一下,http://effbot.org/pyfaq/how-do-i-create-a-pyc-file.htm,有以下指令可以轉成pyc
python -m compileall

2015年5月4日 星期一

GPIO on RPi2 and RPi

Grove Pi+ 的開發背景為RPi,所以只吃到26個pin.
所以使用RPi2就表示還有9個GPIO可以用3V3;5V0其實也不會是問題.
如放棄EED/EEC使用一個12Pin的母頭加排線往外拉到到一個具有獨立電源的GPIO版.
那就不會浪費這幾個Pin了.能做啥呢? 再想想.
補充一下Pin19/Pin20的解釋
MOSI (SPI Bus Master Output/Slave Input) SPI 匯流排主機輸出/ 從機輸入
MISO (SPI Bus Master Input/Slave Output)  SPI 匯流排主機輸入/ 從機輸出
如要使用SPI的話,PIn 23/24/26都會用到,這也難怪會定義一個Pin 17為3V3
這完全是為了要讓RPi的末端作為SPI使用的預設.但這是以26Pin作為考量的設計.
在拿到RPi2的時候還很不解,為何要將SPI放置在中間Pin .這完全是因為RPi只有26 pin的關係

要學習如何控制的話,可以參考這個網頁
http://openmicros.org/index.php/articles/94-ciseco-product-documentation/raspberry-pi/217-getting-started-with-raspberry-pi-gpio-and-python
首先也是是要將RPi.GPIO先安裝起來,
https://pypi.python.org/pypi/RPi.GPIO
1.wget http://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.1.0.tar.gz
2.tar zxf RPi.GPIO-0.1.0.tar.gz
3.cd RPi.GPIO-0.1.0
4.sudo python setup.py install
Coding的時候需要使用import招喚他.
import RPi.GPIO as GPIO
**PS. Pin Define Table:
.
3cb6a78cgd69efe95e72c&690  RPi
擷取RPi2

PS2 Eyetoy on Raspberry Pi

300px-EyeToy
請參考下列網址
https://geekytheory.com/?p=2991&preview=true?p=2991&preview=true

快速指引如下
1.lsusb
確認是否有看到Sony,有就繼續,沒有請將Eyetoy接入USB接口

2.lsusb -s1:X –v

3.sudo apt-get install v4l-utils
安裝Video for Linux套件

4.ls -al /dev/video*
確認Eyetoy的位置,我看到的是video0

5.sudo v4l2-compliance -d /dev/video0

6.sudo apt-get install motion
安裝motion套件

7.sudo nano /etc/motion/motion.conf
修改motion套件的起始參數.
daemon OFF 改為 ON
webcam_localhost ON 改為 OFF
locate OFF 改為 ON
width 320 改為 640
height 240 改為 480

8.sudo nano /etc/default/motion
修改motion server的起始參數.
start_motion_daemon NO 改為 YES

9.sudo service motion restart
啟動server

10.startx
進入視窗x

11.開啟瀏覽器網址為RPi的IP:8081
ex: 192.168.0.18:8081
應該就會看到EyeToy的畫面了.

12.如要關閉motion請打.sudo service motion stop


PS.What is Eyetoy請參閱
http://en.wikipedia.org/wiki/EyeToy

Lib for GrovePi

在python下有除了import的方式,還有另外一種寫法
from grovepi import *
from grove_rgb_lcd import *

因此找一下範例的sample code的目錄就會看到grovepi.pyc , grove_rgb_lcd.pyc這兩個檔案
推測這應該就有點雷同C裡面的 #include <xxx.h>
如要引用的話,看來得要跟好好的研究這兩個檔案了.
Python 的程式是寫在 .py 裡,也就是說, .py 檔是 Python 的原始程式碼檔案,而 Python 會在執行 .py 檔時,將 .py 的程式碼編譯成中間程式碼檔 ( byte-compiled ) 的 .pyc 檔以加快下次執行的速度。通常是被來做 import 的 .py 檔才會產生出 .pyc 檔的。
from grove_rgb_lcd import *
在Grovepi的範例內針對RGB LCD,招換了grove_rgb_lcd.pyc
而程式中只用SetRGB(xxx,xxx,xxx); SetText(“xxxxxxoooxoxox”) 就可以很簡單地透過I2C控制RGB LCD.這大概就是使用grovepi的好處吧,有現成的API.要是沒花錢買這套件,現在可能還在花時間研究更多的I2C的控制細節..

2015年5月2日 星期六

Link Flash Disk to Raspberry

如何使用將Flash Disk與RPi連接呢?
1.首先須要將Flash Dsik插入RPi的USB接口
2.再輸入ls -l /dev/disk/by-uuid/
3.這時候如果有看到多出一個../../sda1
那恭喜了.目前該Flash Disk已經被標示其uuid為/dev/sda1
4.只要再輸入sudo mount /dev/sda1 /mnt
就可以將該Flash Disk指向到/mnt的目錄
5.只要在cd /mnt就可以看到Flash Disk的內容物了.
但如果步驟3啥都沒看到,請打lsusb確認一下有沒有看到Falsh Disk的描述
如果出現unknow,有可能Falsh Disk與RPi不相容.
我自己的測是發現容擴的Flash Disk的確會出現這個問題,正所謂一分錢一分貨.
山寨的Flash Disk以後不會買了.

2015年5月1日 星期五

Python的迴圈

看了一些Python程式碼後.因為有一些C或是Basic的根深蒂固的語法.

C是這樣寫的.
for (起始值; 條件式; 更新值) {
指令一;
指令二;
指令三;
}
Basic是這樣寫的.
for i = 起始值 to 結束值 step 更新值;
指令一;
指令二;
指令三;
next i  
一直搞不清楚Python loop的終端.下圖就是一個解釋.原來Python的迴圈內的指令是以i為頭對齊的.
並沒有像C還有一個括弧…所以一開始會有點覺得python這條蛇很玄,到底他是怎樣跑迴圈的.
結果答案在格式上.
image
https://www.youtube.com/watch?v=v4sk2MSKK3M
Python支援一個特別的條件判斷式,可以根據最近使用迴圈是否曾用break提早結束而做不同的處理,舉例如下:
for n in set_of_numbers:
    if isprime(n):
        print "Set contains a prime number"
        break
else:
    print "Set did not contain any prime numbers"



除了for迴圈外 While也是一樣的,接著去看張凱慶的網站就比較沒問題了.
http://pydoing.blogspot.tw/2011/01/python-while.html

剩下的問題就是函式庫的問題,到底有多少功能可以直接import xxxxx
這個問題的答案就是花了錢買一本python的程式庫當參考書了..
不花錢的話,請善用網路資源
http://blog.ez2learn.com/2010/04/24/useful-python-libraries/