Tag Archives: mearm

[Arduino/Genuino101 專題] Arduino101 x BLE x MeArm x App Inventor 使用手機藍牙遙控機械手臂

本文將帶領讀者認識Arduino/Genunio101的功能,以及如何使用I2C界面來控制機械手臂MeArm、用BLE(Bluetooth Low Energy)來跟手機溝通,並使用MIT App Inventor來撰寫手機的應用程式來跟控制板溝通。

作者/攝影 袁佑緣
時間  3小時
成本  約1,850(不含101)
難度  * * * * *
材料表

 

1.Arduino/Genuino 101 介紹

2015年10月,Arduino與Intel合作發表了一塊名為Arduino/Genuino 101的開發板,使用x86的核心並搭載BLE(Bluetooth Low Energy)以及IMU(Inertial Measurement Unit),也就是內建加速度感測與陀螺儀,而本次範例將使用101上面的BLE功能,如果想要了解IMU在101上面的應用,可以參考部落格上的另外一篇文章[ Arduino101 專題實作計畫] Arduino101二輪平衡小車DIY

 

101 的詳細規格介紹

 

2. Arduino IDE 環境準備

首先請到Arduino的官網下載最新版本的IDE,https://www.arduino.cc/en/Main/Software
以筆者為例,最新的Arduino IDE版本是8.3,Windows使用者如果不想要系統安裝Arduino IDE的話,可以直接點選Windows zip的選項,下載後解壓縮,點選裡面的.exe檔也可以直接執行。

 

打開Arduino IDE後,我們要來安裝最新的101套件包,因為驅動程式也會包含在裡面,所以不需要在額外安裝囉。請打開Tools -> Board -> Boards Manager,並搜尋101,應該就會有最新版本的Intel Curie Boards跳出來,以筆者為例,最新版本為2.0.2版。

接下來因為我們的101在連接到機械手臂之間,會經過一塊16通道的伺服馬達控制板PCA9685,所以我們必須先下載PCA9685的函式庫才能控制我們的伺服馬達。

請到Adafruit的github上面下載Adafruit-PWM-Servo-Driver-Library

請點選Download,並將下載後的壓縮檔解壓縮後,放到Arduino資料夾裡面的libraries資料夾裡面。

 

3.硬體電路

接下來請準備好若干條母對公的杜邦線,以及電池提供額外的電源(6v),以防驅動機械手臂時電源供應不足,導致101控制板無法正常運作。

完整的電路接線圖如下,基本機械手臂上的四顆伺服馬達只要把接頭正確的接上PCA9685上就行了,PCA9685上面黑色的部份表示接地線,紅色部份表示電源線,黃色則是訊號線,我們可以透過此腳位輸入PWM訊號來控制伺服馬達。

PCA9685接到101的部份只要把SDA、SCL這兩個腳位接起來,好讓101可以透過I2C來跟PCA9685溝通,另外再接上VCC跟GND以提供PCA9685工作時所需的電壓就行了。

接完之後大概就會如下完成圖,因為這塊伺服馬達控制板的關係,所以我們不需要一塊額外的麵包板跟很多條的杜邦線互相接,是不是很方便啊?

 

4.Arduino 程式設計

請在Arduino IDE 上面完成以下的程式碼。

#include <CurieBLE.h>
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>

#define SERVOMIN  150 
#define SERVOMAX  600 

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

BLEService BLE_serv("19B10010-E8F2-537E-4F6C-D104768A1214");
BLEUnsignedIntCharacteristic BLE_char("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

void setup() 
{
    Serial.begin(9600);
    pwm.begin();
    pwm.setPWMFreq(60);

    BLE.begin();
    BLE.setLocalName("mearm");
    BLE.setAdvertisedService(BLE_serv);
    BLE_serv.addCharacteristic(BLE_char);
    BLE.addService(BLE_serv);
    BLE_char.setValue(0);
    BLE.advertise();

    Serial.println("Waiting for connections...");
}

void loop() {
    BLEDevice central = BLE.central();
    if(central)
    {
        Serial.print("Connected to central");
        Serial.println(central.address());
        while(central.connected())
            if(BLE_char.written())
            {
                int servo_num = BLE_char.value();
                int pulse_len = BLE_char.value();
                pwm.setPWM(servo_num, 0, pulse_len);
            }
        Serial.println("disconnected");
    }
}

程式說明:

以上的程式碼主要會引入兩個函式庫,一個是用來控制馬達的<Adafruit_PWMServoDriver.h>,另一個則是待會要用來跟手機溝通的<CurieBLE.h>,接下來的程式碼就是初始化一個BLE的Service,然後裡面

包一個Characteristic,主要負責來接收手機端傳送過命令。來馬達編號,還有指定的馬達PWM訊號,藉此來操控我們的機械手臂。

在while(central.connected())迴圈當中,101會一直去確認是否有新的訊息送過來,如果有收到訊息,就會把收到的來馬達編號,還有指定的馬達PWM訊號,透過pwm.setPWM(servo_num, 0, pulse_len);來控制指定的伺服馬達,藉此來操控我們的機械手臂。

 

5.App Inventor 程式設計

App Inventor是一款圖形化的Android App設計界面,只要您有google帳號,就可以直接線上編輯,雲端儲存,還可以打包下載成APK檔,然後傳到手機裡安裝,如果想要知道App Inventor的教學與應用,可以參考App Inventor中文學習網

接下來我們就要實際動手來寫我們的應用程式了,請先連到MIT App Inventor官網

接下來請新建一個專案,並進到Designer界面,開始進行我們的手機界面佈置。

因為本次專案會用到BLE的元件,所以我們必須用到App Inventor的擴充元件功能,請複製以下的網址http://iot.appinventor.mit.edu/assets/edu.mit.appinventor.ble.aix

並在extension中把BLE元件import進來,如下圖。

接下來請完成以下的元件佈置,其中Slider的最大數值是600,最小數值是150,跟前面Arduino 程式碼裡面定義的一樣,另外Connect按鈕其實是一個清單(而非一般的按鈕元件),按下去之後可以讓使用者去選取要連哪一個藍牙裝置,最下方有一個scan的按鈕,可以用來掃描新的藍牙裝置,掃描附近的裝置後,app就會自動更新清單中可以連線的裝置列表。

 

接下來我們進到Blocks界面,開始設計我們的後台程式。

首先是初始化以及連線清單的設定,在初始化的過程就會先進行一次掃描的動作,並把掃描的結果更新在清單上,此外,當清單被點選之後,程式就會呼叫BLE元件去連線清單內的指定的裝置。

讀者可能會好奇,其中有一個叫做is_connected的函式,這個自定義的元件是有什麼功能呢?其實它就是會根據是否連接到裝置來做一些按鈕跟拉桿的設定,以及此刻狀態的提示,如下圖。

以下則是基本的連線、斷線功能,以及掃描附近裝置與更新的實作。

接下來的這四個Blocks,讀者可以直接從字面上的意思去解讀他的功能,也就是當編號1到4的拉桿被拖動時,就會執行update_and_send的函式,也就是更新拉桿上面馬達狀態的提示以及送出指定的馬達脈波長度。

update_and_send的實作如下,基本上就是會根據拉桿的位置對應到的數值,送出指定的控制指令,這邊值得注意的是要記得把serviceUuid跟characteriscUuid改成跟前面Arduino程式碼裡面指定的一模一樣喔,不然BLE會無法進行資料的溝通。

到此為止已經大功告成囉,接下來就剩下把App下載到手機上就完成了,您可以點選Build -> App(provide QR code for apk,讓App Inventor把編譯好的程式碼暫時存到雲端,並顯示QRcode,讓您可以掃描它來安裝App。

 

注意:

由於BLE元件是App Inventor相當新的功能,所以對於一些手機較舊的讀者可能會發現無法安裝或者是無法使用的問題,這只能換更新版本的Android系統或者是看看App Inventor官方未來是否會有相關的計畫來支援舊版本的手機。

 

相關文章:

[LattePanda] 從零開始教學,在LattePanda上使用Python與Arduino來控制meArm機械手臂

本文章將帶領讀者從基礎開始,到學會用在LattePanda上面使用Python跟內建的Arduino Leonardo來控制機械手臂,想學習Python圖控界面,與Arduino的Serial溝通,或者是機械手臂的介紹的朋友不妨來看看本篇教學文喔!

作者/攝影 袁佑緣
時間  3小時
成本  約1,850(不含LattePanda)
難度  * * * * *
材料表

1.Python的環境安裝

首先請到python的官網(https://www.python.org/downloads/windows/)下載最新版的安裝檔,在這邊要提醒一下python目前有兩種版本,一個是2.7x版,另一個3.x版,2.7x版python是比較舊的版本,同時官方也有發出聲明將不會在繼續更新了,而本篇的範例使用的是新版3.x的python,所以請讀者注意一下不要選錯囉。

以筆者為例,最新的Python版本是3.6.1,以及LattePanda是64bit版本的,所以點選Windowsx86-64-excutable installer,如下圖。

接下來請記得在安裝python的時候將下方”Add Python 3.6 to PATH”勾選起來,意思是要把python加入windows的環境變數內。

安裝完後,為了測試我們的電腦是否能正常呼叫python,請呼叫您電腦的終端機,windows的使用者請按下快捷鍵”win+R”便會在左下角顯示執行視窗,接著輸入”cmd”,這樣一來就會叫出windows的命令提示字元,如下圖。

命令提示字元(command prompt)

接下來請輸入”pip install matplotlib”,使用python的套件管理員pip來安裝matplotlib這個套件。

接下來請輸入”pip install pyserial”,使用python的套件管理員pip來安裝pyserial這個套件。

接下來為了要讓讀者方便開發python的程式,請到以下的網站(http://thonny.org/)下載並安裝Thonny這個python IDE。

2.Arduino 環境準備

請到官網下載最新板的Arduino IDE,下載網址請點這裡。以筆者為例,最新版本的Arduino IDE為8.2板,因為LattePanda上面運行的Windows10,所以請記得點選windows版的IDE來下載,另外為了不覆蓋到LattePanda系統原本舊版的Arduino,請點選”Windows ZIP file for non admin install”。

想直接下載的話請點選JUST DOWNLOAD,當然如果行有餘力的話也可以給予Arduino一些贊助喔!

最後解壓縮完成之後,點開Ardunio的資料夾執行IDE的程式即可。

另外,為了要控制LattePanda內建的Arduino Leonardo,必須將控制板選為Arduino Leonardo。

Arduino IDE在上傳程式碼的時候,需要選擇對應的port(連接埠)才能上傳到控制板上,如下圖,請選擇有Arduino Leonardo的COM port。

 

3.執行本專案的程式碼

請在Arduino IDE 上面完成以下的程式碼。

#include <Servo.h> // 引入Arduino控制伺服馬達的函式庫

Servo s[4]; // 建立一個長度為4的servo物件

// 宣告收到Serial的訊息與長度
int  data;
size_t data_size = sizeof(data_size);

void setup()
{
    Serial.begin(115200); // 將Serial的鮑率設定為115200
    
    // 將4個servo對應到以下4個Arduino腳位
    s[0].attach(7); 
    s[1].attach(8);
    s[2].attach(9);
    s[3].attach(10);
}


void loop()
{
    // 如果從Python圖控界面收到的資訊是s開頭,則檢視下一個字元
    // 是指定哪一個伺服馬達(0~3號)
    // 最後再接收一4個bytes的整數,作為馬達要轉到的角度(0~180度)
    if(Serial.available())
        if(Serial.read() == 's')
        {
            int servo_number = Serial.read() - '0';
            if(servo_number < 4 && servo_number >= 0)
            {
                Serial.print("Servo number: ");
                Serial.println(servo_number);

                while(Serial.available() < data_size);
                Serial.readBytes((char*)&data, data_size);
                Serial.println(data);
                s[servo_number].write(data);
            }
        }
}

上傳Arduino程式碼

請先確認您的Arduino IDE是否有按照2. Arduino環境設定,將Arduino Leonardo的板子與連接埠都選擇正確,並按下快捷鍵<Ctrl+U>或者是如下圖點選上傳的箭頭來上傳程式碼。

打開Thonny,完成以下的Python程式碼。

# matplotlib是用來顯示GUI的函式庫
# serial則是用來跟Arduino溝通的函式庫
# struct跟pack則是在Serial傳輸資料時,打包資訊會用到的工具
from matplotlib.widgets import Slider 
import matplotlib.pyplot as plt
import serial
from struct import pack

# 在連接埠COM8建立一個鮑率為115200的Serial
# 這裡要提醒讀者,記得要把COM8改成您LattePanda上的COM port
ser = serial.Serial('COM8', 115200, timeout=0)

# 定義一個函式,將會根據i(馬達/拉桿編號),回傳指定的函式
def send_ith(i):
    def send(val): # 定義一個函式,用來送出控制馬達角度的訊號
        data_header = bytes('s' + str(i), 'UTF8')
        data = int(val)
        ser.write(pack('<2si', data_header, data))
    return send


# 初始化伺服馬達控制拉桿的圖形化界面以及其對應的函式
a = []
s = []
for i in range(4):
    a.append(plt.axes([0.2, 0.2*(4 - i), 0.6, 0.07]))
    s.append(Slider(a[i], 'Servo' + str(i+1) + ' ', 0, 180, valfmt = '%d', valinit = 90))
    s[i].on_changed(send_ith(i))

plt.show()

執行Python程式

請在Thonny IDE上,按下快捷鍵<F5>或者是點選下圖中的播放鍵來執行Python

如果在執行Python時遇到如下的錯誤,那有可能是您的COM port沒有設定正確,請回去看一下2. Arduino 環境設定那一步中的COM port,並把正確的port輸入上面Python程式碼中。

成功執行後,就可以看到一個簡單的Python互動界面,讀者可以透過上面的拉桿來操控四個伺服馬達各別的角度。

4.接上機械手臂,來動手玩玩看吧

完成上述的步驟後,我們就可以來執行最後的實做部份了,本次範例所使用的機械手臂是有名的開源機械手臂meArm,上面有4個伺服馬達,一共有四個自由度,然後因為特殊的平行連桿機構,最尾端的夾爪會一直保持水平,方便機器夾取物件,加上使用壓克力平板與螺絲螺帽就能輕易組裝,是一個相當好入門的教育套件,接下來我們就來看一下要如何完成電路的連接吧。

LattePanda與機械手臂的接線如下圖,由於本範例所使用的Arduino腳位是7, 8, 9, 10,所以請按照官方給的腳位圖接上去(紅圈的部份)。

特別注意,為了保護馬達與電路系統,電源的部份請最後再接上去。

電路接線圖

LattePanda腳位圖

 

完成圖

上視圖

 

相關文章:

 

[Raspberry Pi x MeArm] Raspberry pi 使用觸控螢幕控制MeArm

本篇文章來跟各位分享如何使用樹莓派搭配觸控螢幕來控制機械手臂MeArm

1.硬體準備

a.樹莓派單板電腦,本範例使用的是 Raspberry Pi 2

b.MeArm機械手臂

c.樹莓派7吋觸控螢幕

d.行動電源,用來供電給螢幕跟主機

e.I2C servo控制板PCA9685,讓樹莓派可以透過I2C來控制,而不需要使用到樹莓派的GPIO腳位

腳位接法(控制板 – Rpi ):VCC接5V,V+也接5V,SDA接SDA,SCL接SCL,GND當然接GND

Jpeg

完成圖:

Jpeg

Jpeg

2.軟體準備

a.先在樹莓派上安裝系統,本範例使用的是官方提供的Raspbian

b.在樹莓派上設定I2C,只要在終端機中打上以下指令就可以了:

sudo apt-get install python-smbus

sudo apt-get install i2c-tools

並且要讓樹莓派一開機就會載入I2C,請以 root 權限編輯/etc/modules,加入以下兩行:

i2c-dev

i2c – bcm2708

接著請進入 raspi-config 的 Advanced options 去啟動 I2C,並重新開機即可

c.下載Adafruit的Raspberry Pi函式庫(官方參考文件),在樹莓派的終端機中輸入:

git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git

d.下載本範例的程式碼,並把它移到Adafruit-Raspberry-Pi-Python-Code/Adafruit_PWM_Servo_Driver的資料夾當中,在終端機中輸入:

wget https://raw.githubusercontent.com/YuanYouYuan/rpi-robotic-arm/master/wxpython_mearm/main.py

cd Adafruit-Raspberry-Pi-Python-Code/Adafruit_PWM_Servo_Driver

mv ../../main.py .

e. 在終端機中輸入sudo python main.py 就可以順利執行了!

3.實際運作情形

Jpeg

軟體運作截圖,途中有四個拉桿可以控制

055

Jpeg
4.操作影片