Tag Archives: genuino 101

[ Arduino101 專題實作計畫] Arduino101二輪平衡小車DIY

作者/攝影 袁佑緣
時間
  • 3小時
成本
難度  * * * * * *
材料表
  • 厚度3mm壓克力板
  • Arduino101控制板
  • 減速馬達x2
  • 麵包板
  • 杜邦線
  • 排針
  • 電池盒
  • 防滑墊
  • 3.7v鋰電池(14500)
  • 鋰電池充電器
  • TA7279P馬達驅動晶片

1. 平衡車車體製作

本範例的平衡車車體主要是由雷切壓克力構成,壓克力的厚度是使用3mm的板材,再藉由螺絲螺帽組合而成,車子的馬達使用的是兩顆小型的5V減速馬達,輪子的部份也是由壓克力組成,胎皮則是貼上一層防滑墊,車子的底部則有兩個3號電池座,裡面各裝兩顆7V的鋰電池,一個用來驅動控制板,另一個則用來驅動馬達。
詳細的CAD檔可以參考筆者放在網路上的onsahpe專案,有興趣的讀者可以參考看看喔!

圖一、平衡車的模擬動畫

圖二、組裝爆炸圖

圖四六七八、車體的三視圖

圖八、平衡車實體圖

 

2.電路接線

本次範例使用的馬達驅動晶片是TA7279P,其腳位功能與編號如下圖(節錄自官方datasheet) ,請將5號及10號腳位接到鋰電池的電源上,並把A、B兩個channel的馬達訊號輸入腳位,也就是1、3、12、13接到Arduino 101上的3、5、6、9號腳位來當作控制板的訊號控制腳位,因為這些腳位才有辦法做PWM訊號的輸出,也因此才能控制馬達的轉速。
至於馬達的部份,請將下表output(輸出)的腳位各自接到兩顆馬達上即可,例如:A channel想控制左馬達,B channel想控制右馬達,那就把4、6號腳位接到左馬達上,9、11號腳位接到右馬達上。
另外也別忘記要給TA7279馬達驅動晶片供給工作電壓,只要在14號腳位供給5V的電力,7號腳位接地就行囉。

圖九、TA7279P腳位功能圖

圖十、TA7279P腳位編號圖

圖十一、完成車體與電線配置!

3. Arduino環境準備

請先準備好Arduino IDE,並請在Arduion IDE上的Boards Manager那邊搜尋關鍵字intel,並如下圖安裝Intel Cuire Board。至於驅動程式的部份,使用MacOS跟Linux的朋友不用擔心,直接使用就可以了,那如果是windows的使用者在第一次將控制板接到電腦上時,會挑出自動安裝驅動程式的視窗,請耐心等候電腦完成安裝就可以進行到下一步囉!

圖十二、Arduino IDE Boards Manager設定

4.程式設計

#include "CurieIMU.h" //引入Arduino 101 IMU的函式庫,用來偵測車體的            角速度與加速度方向

//宣告PID控制的各個參數,各個參數的最佳數值必須視車體情況而定,不同的車體會有所不同,電力的大小也會有影響
const float kp = 24; 
const float ki = 0.05;
const float kd = 15;

//宣告參數K作為complimentray filter的參數
const float K = 0.95;

//list number的大小會決定取平均的樣本數,越多則越準,但也會花掉更多計算時間
const int angle_list_number = 5;
const int error_list_number = 10;

//設定馬達初速為0
int speed = 0;

//定義馬達的驅動腳位
const int motor_A_1 = 3;
const int motor_A_2 = 5;
const int motor_B_1 = 6;
const int motor_B_2 = 9;

//宣告進行角度計算與PID控制會用到的一些參數
float time, time_pre, time_step;
float gyro_angle = 0;
float acce_angle = 0;
float angle_list[angle_list_number];
float pre_error = 0;
float error_list[error_list_number];
float diff_error = 0;
float offset = 0;

void setup()
{
	for(int i = 0; i < angle_list_number; i++)
		angle_list[i] = 0.0;
	for(int i = 0; i < error_list_number; i++)
		error_list[i] = 0.0;
	pinMode(motor_A_1, OUTPUT);
	pinMode(motor_A_2, OUTPUT);
	pinMode(motor_B_1, OUTPUT);
	pinMode(motor_B_2, OUTPUT);
	pinMode(13, OUTPUT);

	Serial.begin(9600);
	Serial.println("Start!!!");

//設定Arduino 101 的IMU感測器	
      CurieIMU.begin();
	CurieIMU.setAccelerometerRange(4);
	CurieIMU.setGyroRange(250);
	time = millis();
	for(int i = 0; i < 5; i++)
	{
		Serial.println("Ready...");
		delay(200);	
	}
	int time2 = millis();

//待機兩秒後,取得一個初始位置的角度,這個位置將會是平衡車目標的平衡位置
	while((millis()-time2) < 2000)
		offset = get_angle();
	digitalWrite(13, HIGH);
}

void loop()
{
//主迴圈會一直去讀取現在角度與目標角度的誤差,並透過PID控制來回傳修正動作給馬達
	float error = get_angle();
	float feedback = PID_feedback(error);
	if(abs(error) > 70)
//當傾斜角度過大時,會視為倒掉,此時將會停機並等待重啟
	{
		while(true)
		{
			analogWrite(motor_A_1, 0);
			digitalWrite(motor_A_2, LOW);
			analogWrite(motor_B_1, 0);
			digitalWrite(motor_B_2, LOW);
			Serial.println("Stop!!!");
		}
	}
	balance(feedback);
}

//平衡函式將會根據PID算出的回饋數值,呼叫馬達做出相對應的修正動作
void balance(float feedback)
{
	speed = int(feedback);
	if(speed < 0)
	{
		analogWrite(motor_A_1, abs(speed));
		analogWrite(motor_B_1, abs(speed));
		digitalWrite(motor_A_2, LOW);
		digitalWrite(motor_B_2, LOW);
	}
	else
	{
		digitalWrite(motor_A_1, LOW);
		digitalWrite(motor_B_1, LOW);
		analogWrite(motor_A_2, abs(speed));
		analogWrite(motor_B_2, abs(speed));
	}
}

//讀取角度的函式會透過計時器累加的部份,將IMU讀到的角速度離散積分成角度,同時會做平均取值並輔以complimentary filter的方式來將精確的角度數值計算出來
float get_angle()
{
	time_pre = time;
	time = millis();
	time_step = (time - time_pre)/1000;

	float ax, ay, az;
	float gx, gy, gz;
	CurieIMU.readAccelerometerScaled(ax, ay, az);
	CurieIMU.readGyroScaled(gx, gy, gz);

//將以下的註解取消掉的話可以從Arduino 101的Serial讀到此刻感應器的原始數值,記得baud rate要跟前面宣告的一樣設定成9600,另外要提醒一下如果開啟Serial輸出的功能的話,會消耗掉額外的計算資源,所以如果已經不需要再讀取數值時,最好把以下的程式碼註解掉
	//Serial.print(ax);
	//Serial.print("\t");
	//Serial.print(ay);
	//Serial.print("\t");
	//Serial.print(az);
	//Serial.print("\t");
	//Serial.print(gx);
	//Serial.print("\t");
	//Serial.print(gy);
	//Serial.print("\t");
	//Serial.print(gz);
	//Serial.println();
	
	gyro_angle += gy*time_step;
	acce_angle = (180/3.141593) * atan(ax/az);
	for(int i = 0; i < angle_list_number-1; i++)
		angle_list[i] = angle_list[i+1];
	angle_list[angle_list_number-1] = K * acce_angle + (1-K) * gyro_angle;
	float mean_angle;
	mean_angle = 0.0;
	for(int i = 0; i < angle_list_number; i++)
		mean_angle += angle_list[i];
	mean_angle /= 5;
	mean_angle -= offset;
	return mean_angle;

}

//PID回饋的函式會將錯誤進行一連串的計算,並根據開頭我們設定的三個係數來做出適當的回饋
float PID_feedback(float error)
{
	for(int i = 0; i < error_list_number-1; i++)
		error_list[i] = error_list[i+1];
	error_list[error_list_number-1] = error;

	float sum_error = 0;
	for(int i = 0; i < error_list_number; i++)
		sum_error += error_list[i];
	diff_error = error - pre_error;
	pre_error = error;
	float p_term = kp * error;
	float i_term = ki * sum_error;
	float d_term = kd * diff_error;
	float feedback = p_term + i_term + d_term;
	if(feedback >= 255)
		feedback = 255;
	else if(feedback <= -255)
		feedback = -255;

//跟前面一樣,把以下程式碼的註解拿掉的話可以從Serial讀出實際得出的回饋
	// Serial.print("P_term: ");
	// Serial.print(p_term);
	// Serial.print("\tI_term: ");
	// Serial.print(i_term);
	// Serial.print("\tD_term: ");
	// Serial.print(d_term);
	// Serial.print("\tError: ");
	// Serial.print(error);
	// Serial.print("\tFeedback: ");
	// Serial.println(feedback);
	return feedback;
}

 

5.實際操作

 

相關文章:

[活動紀錄 ] Arduino/Genuino 101 教學課程分享in Clubhouse

CAVEDU教育團隊前進Intel Clubhouse!在8週的課程裡,進行Genuino 101的基礎教學,並且讓學員們完成一臺手機藍牙遙控車!

作者/攝影 洪卉君
課程時間  8週 (週四 18:00-20:00)
課程講師 徐豐智
課程場地 Clubhourse

感謝臺灣Intel的邀約,CAVEDU教育團隊從2016年10月至12月,在臺灣Intel Clubhouse(財團法人台北市基督教勵友中心)和學員、志工們一起進行了8週的Genuino 101教學課程

來看看8周的課程都做了什麼吧:

Week 1Week 2Week 3Week 4
Genuino 101 基本操作Genuino 101 功能應用—LED呼吸燈Genuino 101 功能應用—可變電阻遙控車組裝教學
Week 5Week 6Week 7Week 8
學員挑戰—遙控車改裝APP INVENTOR—APP製作程式教學學員挑戰—自己寫程式控制遙控車課程內容整合—遙控車呈現

臺灣Intel Clubhouse的學生、志工們完全沒有任何電子、電路基礎,因此在課程教學上除了教學中學員們常見的疑惑以外,天馬行空的問題也不少,不過這些天馬行空的問題很多是真的有辦法實現或解決的!也很佩服學生們能夠想到一些「意料之外」的方式呢!

首三週的程式教學,雖然是比較死板的安裝、啟動、寫程式碼等等內容,但是安排了LED燈和可變電阻這兩項簡單的元件,讓學生實際透過Genuino 101來操控。學生們對於可以依自己的想法控制這些電子元件都感到很興奮。

從第四週開始,就進入本次課程的重頭戲——遙控車製作與操控了。除了硬體上的Genuino 101加遙控車組裝,我們也加入了App Inventor的教學,讓學生可以寫出自己的手機程式並且用它來控制自己製作的遙控車。寫App得到了很好的迴響,我們先教學生入門款的依指令讓手機發出聲音、跳出圖片等等簡單的小動作。學生們在決定音效、圖片、甚至是呈現的方式,都很有自己的想法!看著學生們七嘴八舌地分享自己為手機做出了什麼酷炫的功能,總是會忍不住想要再多教一點啊!

最後學生們終於可以用手機控制自己的Genuino 101遙控車啦!立刻在教室外面的走廊舉辦了第一屆臺灣Intel Clubhouse盃賽車,還開了Facebook直播。看到同學們都可以做出一臺遙控車,並且結合自己的想法來執行藍牙操控的程式。覺得很開心!希望學生們可以利用我們留在臺灣Intel Clubhouse的材料組,結合這次課程的教學內容,試著實現腦海中的想法。

 

[課程成發]海洋機械Arduino課程期末專題展示

紀錄撰寫  曾吉弘紀錄攝影曾吉弘
課程講師  曾吉弘上課地點海洋大學
課程時間  2016 9月~ 2017 1月

阿吉老師在海洋大學的學期課程[Arduino微處理機課程(課程網站)] 順利結束了,感謝台灣英特爾公司贊助本學期所使用之Arduino 101開發板。2015年則是感謝聯發科技公司贊助的LinkIt ONE物聯網開發板(期末展示請點我)

一學期的課程中,同學要學會使用Arduino進行基礎I/O控制、App Inventor 藍牙控制這兩大主題,期末也要做一個專題出來。評分標準是這樣的:

  • 出席:10%,無故缺席每次扣學期總分2分,扣完為止。請務必親自請假,不接受代請。
  • 回家作業/課堂競賽:30% (5% x 6),取高分
  • 期中專案報告:20%,至少有一個完整的功能可運作
  • 期末專案展示:30%
  • 自評5%
  • 組員互評5%

我對於學生的要求很簡單:用心做,少找藉口。但即便這樣到了學期中還是退選了接近一半的人(10多位…),這件事總之就是教一個算一個囉,不經意找到Facebook回顧兩年前我對於學生期末專題的一些總括性意見,列於文末,想看的朋友請耐心看完吧。

專題製作列表:

  • 手持穩定架
  • 寵物自走餐車
  • Axi draw 寫作業機器人(但是要寫很久…)
  • 變形手機多功能座車
  • 遠端探險遙控車
  • 紅外線遙控自動避障掃地機器人
  • 無用盒子

 

手持穩定架

運用Arduino 101 上的加速度計與陀螺儀做出的手持穩定架,相當不錯

遠端影像遙控機器人

遙控功能使用 App Inventor BLE 控制 Arduino 101,影像串流則使用7688 Duo (學生自己去買的,願意自己去找資源這點還挺欣慰的

學生專題常見的狀況,電路板沒有固定,電線長度嚇死人…   除了容易脫落遭成機器人出問題之外,甚至有可能短路而失火

 

紅外線掃地機器人

壓克力自己切的,但您可以發現馬達安裝孔位太外面了,很容易讓壓克力裂開。另一方面,馬達轉速太高其實很難把灰塵掃起來

無用盒,按下搖頭開關會伸出一隻手(servo帶動) 來把按鈕推回去,可以無限次數一直推推推,適合有強迫症的人使用

Axi draw 學生自己畫圖3D列印出來的寫字機器人,可以把要寫的字轉成G code 之後寫出來,目標是可以幫忙寫作業,但是要寫非常久… (還是自己寫比較快…)

以下是demo照片,各組作品的文件與程式碼都會放在本課程專題頁面

demo 完就吃pizza(當天基隆狂風暴雨,辛苦去拿的同學了),阿吉老師的課就是有棍子也有胡蘿蔔,好好做老師不會虧待大家的啦~

 

阿吉老師2014年寫的感言

以下是我對於這學期某堂課,給同學的評語。我衷心期待每位同學都能在認真學習之後有所收獲。文長慎入…

=======================================

各位同學辛苦了,希望這學期大家都有學到東西。以下是我對於各位在本學期表現的講評:

遲到問題:如果您是習慣性遲到的人,這個特性應該多少也會反映在您的待人接物與專題品質上。

上課態度:這…不用我多說,您自己最知道自己上課是怎麼回事。老師不是媽媽,老師不需要也不應該去一再提醒上課要認真這件事。

專題製作:

基本上大家的文件除了第9組上算完整之外,其他各組的東西都有一定程度上的缺點。包括以下:

  1. 格式不一
  2. 沒有參考資料或說明不清楚(最好都不用查資料就會做)
  3. 甘特圖看不出進度規劃
  4. 組員分工不清楚
  5. 看不出學期專題等級和課堂作業等級的差異(到底有沒有好好檢查過啊!)

至於文件準備方面,我希望大家可以先看看這份投影片(http://www.slideshare.net/mwhan/99-29808114)。文件是讓大家對於專案的進度得以參考與回顧,不是拿來應付。機器人會拆掉,但文件卻能留下來。

有時候您專題做得很好,但文件不完備,這樣學弟妹要參考的時候才有承先啟後的價值。再者,日後您要推甄研究所時,我也希望這學期的東西可以派上用場。如果文件中錯字連篇或是格式不一,您很難去說服別人說這份文件是有認真過的。

我之所以要求一定要現場demo,原因很簡單。電機系的同學對於 presentation 的訓練是稍微缺乏的,這樣您才知道反覆演練,顧到每一個環節之後,才懂得珍惜在台上的每一秒鐘。例如,我明明就有說報告當天要將 word 檔「雙面列印」,幾乎沒有一組做到…當別人知道您卻不知道的時候,我想您需要更謹慎。

有時候,不一定都會有第二次機會。如果您今天去研究所口試,要demo的機器人不會動…

再者,您有好的內容,別人還不讓您有機會說,或是只有非常不足的時間。這時如何「講重點」就很重要。我都讓大家講完,從各位報告的內容當中,我就可大約得知各位在本學期中所付出的程度。

衷心各位在本學期課程中都能有所收穫。

吉弘 2014/01/14

 

 

相關文章:

Genuino 101 Starter Kit 開箱!感謝DFrobot

DFRobot 寄給我們的除了全套拿鐵熊貓之外,還有 Genuino 101 的 Starter Kit,大家可以和 Seeed Studio 的 Grove Starter Kit 比較一下看看兩者的差異。

之後CAVEDU 實習生會陸續把一些有趣的教學玩玩看,再和大家分享心得囉!(blink 我想就不用了啦~)

拿鐵胖達_6192

包含了以下零件與11個專題

Gravity 是 DFrobot 的特殊接頭,如同 Seeed 的 Grove 4 pin 接頭

教學:

  • Arduino Platform and Genuino/Arduino 101
  • 類比與數位訊號
  • 簡易的自動控制裝置
  • Project 1. LED閃爍
  • Project 2. 感測燈光
  • Project 3. Mini Lamp
  • Project 4. 聲音觸發LED
  • Project 5. LED呼吸燈
  • Project 6. Light調節器
  • Project 7. 潘朵拉的盒子
  • Project 8. 藍牙連線
  • Project 9. 氣象站
  • Project 10. 芝麻開門
  • Project 11. 電子坡度偵測

有個相當好聽的名字:夜光寶盒。但我想應該沒有螢光塗料在上面就是了,哈哈

拿鐵胖達_8597

259-900x600