2017年4月1日 星期六

Arduino 鍵盤

如何將Arduino變成一個USB鍵盤,輸入文字到電腦中,本文根據其它文章整理出實作步驟。

Arduino程式發送按鍵訊號

發送按鈕似乎可以用 Arduino 的 MouseKeyboard lib 但沒實做過。

這裏參考 Arduino Uno Keyboard 的 程式 ,因我想要發送 Ctrl + Alt + Del 鍵,程式碼如下


#define KEY_LEFT_ALT_CTRL 0x05   /* ctrl 是 0x1, alt 是 0x4 */
#define KEY_DEL 76

uint8_t buf[8] = { 0 }; /* Keyboard report buffer */

Serial.begin(115200);

buf[0] = KEY_LEFT_ALT_CTRL;    /* Ctrl + Alt 鍵*/
buf[2] = KEY_DEL;              /* Del 鍵 */
Serial.write(buf, 8);


按鍵的代碼可參考 Hut1_12v2.pdf


Arduino DFU mode

因 Arduino 的USB埠,預設狀態下只能接收資料,不能發送資料出去,因此需要更新 Atmega8u2 韌體,讓 Arduino USB 變成一個USB 鍵盤。而讓Arduino進去DFU mode,才能燒錄新韌體。

  • 下載燒錄軟體
ATMEL網站下載FLIP 軟體,接著參考 如何讓 Arduino Uno 進入 DFU mode,讓 Arduino 進入DFU模式。

在剛才的下載的程式裏,有韌體程式,或者到這裏下載,其中會用到2隻程式
  1. Arduino-keyboard-0.3.hex  -  燒錄此程式會讓 USB 埠變成一個 USB 鍵盤
  2. Arduino-usbserial-uno.hex  -  此程式是 Arduino 原本的模式,燒錄此程式就可回到原來的狀態

  • 進入 DFU mode
參考 如何讓 Arduino Uno 進入 DFU mode ,讓 Arduino 進入 DFU 模式

  • 燒錄USB鍵盤模式韌體
參考 如何用 FLIP 更新 Atmega8u2 的韌體,將 Arduino-keyboard-0.3.hex 燒錄進去


接著拔掉 Arduino 電源,就會取消 DFU 模式,再接上電後,Arduino 就會變成一個 USB 鍵盤,發送 Ctrl + Alt + Del 按鍵給電腦。

當你想修改 Arduino 程式重新上傳時,由於這個 Arduino 的USB 是一個USB 鍵盤,無法把程式傳進去,所以必須再進入 DFU 模式,把 Arduino-usbserial-uno.hex 燒錄進去,然後才能再上傳程式。

2017年3月8日 星期三

Arduino - 無線電遙控

Arduino 發送及接收無線電訊號

由於紅外線(IR)有指向性,遙控時需對準接收器,而且不能有障礙物阻隔,相較之下,無線電遙控的方式就比較理想。

  • nRF24L01+ 無線電傳輸/接收模組



nRF24L01+接腳圖

圖片來源



  • LD1117A壓降IC

參考 smallbee 的說明,由於 nRF24L01+ 接的電源需為3.3V,Arduino電源為5V,因此需要 LD1117A 壓降 IC,以及4.7uF 電容,將 5V 降為 3.3V。

需注意LD1117A 有多種不同的壓降電壓,如下圖 L33AUL 中的 33 表示3.3V

LD1117A規格


參考 http://tmrh20.github.io/RF24 ,電路圖如下


後來發現 Arduino 的3.3V接腳可供電給 nRF24L01+,修改後的電路圖如下



下載 RF24程式, 開啟 examples\GettingStarted 的 Arduino 程式,這隻程式只要調整裏面的參數,分別上傳到 Arduino 上,就可成為 RF 傳送及接收器,並透過序列埠監控視窗觀察資料。

參考資料: Arduino nRF24L01+

其中以下這段程式,即是使用第7、8腳位,如電路圖中的D7、D8接腳

/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 7 & 8 */
RF24 radio(7,8);



  • 發送端設定

在這個 GettingStarted 程式中,將 radioNumber 及 role 設定為 1,然後上傳到 Arduino。這個設定下程式會先送出訊號,然後等待對方回傳訊號,收到後便將訊息寫到序列埠上。


  • 接收端設定

將 radioNumber 及 role 設定為 0,這個設定下程式會先等待訊號,一旦收到訊號,便會發送訊號回去,並將剛才收到的訊號,寫到序列埠上。

2017年1月20日 星期五

小方智能攝像機設定







  • 打開 app,登入帳號,若沒有帳號需先申請一個
  • 確認登入的地區是大陸,否則待會wifi連線會失敗

  


  • 確認手機藍芽功能有開啟
  • 重設小方攝影機,重設鈕在底部的 "setup"
  • 在 app 按新增裝置



  • 可搜尋到攝影機,若沒有可按掃描裝置

2015年10月17日 星期六

Raspberry - 使用PCA9685控制板,控制伺服馬達

本篇文章說明如何使用樹莓派,連接PCA9685 16路PWM控制板,驅動伺服馬達(步進馬達)


樹莓派本身可直接驅動伺服馬達,可參考伺服馬達 甘苦談丫,但若要控制多個伺服馬達,就需透過PCA9685 PWM控制板來達成。


由於網路上許多介紹PWM控制板的文章,都是使用Arduino來實作。不斷地尋找與實驗後,終於找到可行的方法。


首先需要有PCA9685 控制板,很容易可以買得到



PWM控制板與樹莓派的腳位連接如下

腳位對應如下,SDA及SCL分別連接到樹莓派的第3、5腳位,此2 腳位是樹莓派用來做I2C 用途的腳位。

PCA9685Raspberry PI
VCC3.3 VDC Power
GND0V (Ground)
SDA3. SDA0 (I2C)
SCL5. SCL0 (I2C)



以上PWM控制板的4隻腳,皆連接至樹莓派。而PWM控制板上另有2隻VCC、GND腳(如下圖紅框),需連接至另一個獨立的電源,不可與樹莓派共用。





完整的連接方法如下圖


圖中有三點說明如下:
  1. 樹莓派腳位與PWM控制板的連接處,此處的電源來自樹莓派,供給PWM控制板的電源,接上後控制板的燈便會亮起。
  2. 此處接了2組伺服馬達
  3. 另一組獨立電源,此電源是PWM控制板用來推動馬達用的,若不接此電源,伺服馬達便不會轉動。


接下來說明樹莓派程式的部份
     /etc/modprobe.d/raspi-blacklist.conf
若有 blacklist i2c-bcm2708 這行,在前面加上#號註解掉

  • 修改這個檔案
/etc/modules
增加這行文字
i2c-dev
  • 更新 i2c-tools
     sudo apt-get install i2c-tools
     sudo apt-get install python-smbus
  • 將目前的使用帳號加入i2c 群組
sudo adduser pi i2c

/boot/config.txt
將這行指令加入
dtparam=i2c1=on
  • 重啟樹莓派,然後使用以下指令,檢查安裝是否成功
sudo i2cdetect -y 0 或
sudo i2cdetect -y 1


在上一個步驟中,若沒有加入dtparam 這行指令,有可能在執行這個指令時,遇到以下錯誤
Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory


若順利跑出以下這張圖的內容,則表示成功


驅動伺服馬達的程式,可由Adafruit-Raspberry-Pi-Python-Code 下載
其中這2個檔案是驅動程式函式庫
Adafruit_I2C.py
Adafruit_PWM_Servo_Driver.py


範例程式則是 Servo_Example.py,說明如下

pwm.setPWMFreq(60)                # Set frequency to 60 Hz
while (True):
  # Change speed of continuous servo on channel O
  pwm.setPWM(0, 0, servoMin)      # 將位置 0 的馬達,轉動至 servoMin

  time.sleep(1)                   # 暫停一秒
  pwm.setPWM(0, 0, servoMax)      將位置 0 的馬達,轉動至 servoMax

  time.sleep(1)                   # 暫停一秒

記得馬達要接在第 0 個位置,0~15 共可驅動16個馬達,此程式執行時,馬達會一直不斷地左右轉。

2015年4月22日 星期三

如何使用樹莓派相機,製作即時影像傳輸

網路上有許多樹莓派相機圖傳的教學,這裏參考這篇 「Raspberry Pi Camera」,文章中還有影片,教你如何安裝樹莓派相機。

首先,在樹莓派上,更新軟體
sudo apt-get update
sudo apt-get upgrade

啟用樹莓派相機
sudo raspi-config

影像接收端

接收端使用Windows 系統來接收影像,在該篇文章中提到,需下載 Netcat 及 MPlayer 軟體:
Download Netcat - 接收來自樹莓派的影像串流
Download MPlayer  - 播放影像串流

執行接收端程式
nc.exe -L -p 5002 | mplayer.exe -fps 50 -cache 4096 -cache-min 5 -nosound -

-fps: 每秒播放 frame 數量,此處設定為 50。 
-cache: 影像串流緩衝大小,這裏設定為 4096K
-cache-min: 接收影像串流時,會先將影像暫存在 cache 中,這裏設定為 5,表示緩衝達 5% 時,才開始播放影片,預設為 20% 。
-nosound: 因為沒有聲音,關閉聲音選項避免多餘的處理。

MPlayer 詳細的參數說明可參考這邊 MPlayer Doc

執行後,程式開始等待串流輸入











畫面上「Cache fill」就是代表已緩衝容量


影像傳送端

在樹莓派端,啟動錄影及影像傳送,指令如下:
raspivid --nopreview -w 800 -h 600 -fps 25 -b 1000000 -t 99999 -o - | nc 192.168.1.116 5002

其中 IP 的部份需換成接收端的 IP 位置,其餘參數說明如下:
--nopreview: 若不加此參數,會在樹莓派上彈出一個視窗播放影片。
-w, -h: 影像的寬度、高度。
-fps: 錄影時每秒 frame 數量,這裏設定為接收端的一半。
-b: bitrate傳輸率,這裏設定為 1000000 代表1M bits / 每秒,這個值越小,影像品質越低,影像容量越小,傳輸速度越快。
-t: 錄影時間,設定一個很大的數字。

重點來了,執行時必須先啟動接收端程式,再執行樹莓派影像傳送
為什麼呢? 因為當你先執行影像傳輸,再啟動接收端程式時,假設這兩個動作相隔 5 秒,由於已經錄了 5 秒了,接收端播放的影像,就會至少延遲 5 秒。

影像傳輸時,接收端會先將影像暫存在 cache 中,這裏設定 cache-min 為 5%,表示串流影像在 cache 中緩存達 5% 時開始播放,這時因為已經有 5% 的影像在 cache 中,因此播放的影像並不是即時影像。

因此將傳送端的 fps 設定為 25,接收端的 fps 設定為 50,使得接收端以快動作的方式播放,很快就會把 5% 的影像收完,再來,就會收到即時的影像,因此 cache-min 這個值也不能太高。
















以此設定值來測試,影像延遲大約 0.3 秒。

有一篇文章談到如何將樹莓派影像,傳送至Android裝置
Android and Raspberry Pi Camera low/no latency via gstreamer