2016年11月8日 星期二

[無人機]測試用硬體


電機
新西達480S/950KV 無刷馬達
http://blueskymodel.com/product_info.php?products_id=2380

15級引擎馬力...高效率優質馬達!!!
輕質量高扭力大馬力的一顆優質馬達
全新改款設計…精選材料/精緻設計/精密加工/高品質/重量輕/高馬力/高推力/
適用保麗龍及巴爾沙木製大小機型相當於15級2行程引擎馬力
 3D機、滑翔機、特技機、像真機、適用 
高效能12槽14極外轉子無刷馬達高精度動平衡設計
◎最新高純度超薄0.2mm矽鋼片定子,低鐵損無磁殘留,有效提昇馬達效率降低馬達溫度
◎高精度防磁外轉子高轉速平衡低噪音
◎加強型耐衝擊低阻力日本高速培林
◎三個培林支撐軸心設計運轉精度更高
 480S /A2217/15級飛機用外轉子無刷馬達規格表

直徑                     
27.8mm
長度
34mm
重量
65g
軸心尺寸
4.00mm
每伏特轉速
950/1100/1250/1500/1750rpm/V
最佳效率值
85%
適用電池數
2~3cell Li-ion/Li-poly
最大持續電流 
20~28A 
最大瞬間電流
22~35A / 60sec
最佳效率電流
8~28A(>80%)
建議機體重量     

600~1000g
電調
好盈 飛騰系列 FlyFun-40A/2~6S/NO BEC 無刷電子調速器/電變
http://www.gejore.tw/shop/goods-5034.html


適用於
1. 400/450直升機3D。
2. 32級固定翼Sports。
3. 多軸飛行器。


FlyFun-40A和FlyFun-40A-OPTO的主要區別在於:前者有內置BEC而後者沒有。
產品編號分別為:80020620(FlyFun-40A) 和  80020622 (FlyFun-40A-OPTO)



產品規格: 
1、 輸出能力:持續電流40A,短時電流55A(不少於10秒)。
2、 電源輸入:2-6節鋰電池組或5—18節鎳氫/鎳鎘電池組。
3、 BEC輸出:
      ●FlyFun-40A: 3A (開關電源穩壓模式-switch mode)
      ●FlyFun-40A-OPTO:無
4、 油門信號頻率範圍(Refresh rate):50Hz—432Hz。
5、 最高轉速:2極馬達210000轉/分鐘,6極馬達70000轉/分鐘,12極馬達35000轉/分鐘。
6、 尺寸:
      ●FlyFun-40A: 60mm(長)*28mm(寬)*15mm(高)。
      ●FlyFun-40A-OPTO: 60mm(長)*28mm(寬)*12mm(高)。
7、 重量:
      ●FlyFun-40A: 38.8g(含散熱片)。
      ●FlyFun-40A-OPTO: 35.2g(含散熱片)。
8、 附件: 參數設定卡(可選配)。
 
產品功能:
1、 安全上電功能:接通電源時,無論油門搖桿處於任何位置均不會立即啟動電機,避免造成人身傷害。
2、 油門行程校調功能:適應不同遙控器油門行程的差別,提高油門響應的線性度。
3、 程序設定項目:
      ●剎車設定:無剎車/有剎車。
      ●電池類型:Li-xx(鋰電池)/ Ni-xx(鎳鎘或鎳氫)。
      ● 低壓保護模式:降低功率/關閉輸出。
      ●低壓保護閾值:低/中/高。
      ●啟動模式:普通/柔和/超柔和啟動。
      ●進角:低/中/高。
      ●恢復出廠默認值。
4、 全面的保護功能:
      ●欠壓保護:由用戶通過程序設定,當電池電壓低於保護閾值時,電調自動降低輸出功率。
      ●過壓保護:輸入電壓超過輸入允許範圍不予啟動,自動保護,同時發出急促的「嗶嗶」告警音。
      ●過熱保護:內置溫度檢測電路,電調溫度過高時自動降低輸出功率。
      ●遙控信號丟失保護:遙控信號丟失1秒後降低功率,再有2秒無遙控信號則關閉輸出。

工藝特點:1、 電源輸入端採用超低阻抗大容量電解電容,極大提高抗干擾能力。
2、 輸出MOSFET功率管配備獨立散熱片,有效降低器件溫升,提高系統大電流工作能力。
3、 單片機採用獨立穩壓芯片,避免BEC負載變化造成電源干擾,提高單片機工作穩定性。

2016年11月7日 星期一

[MultiWii]Source Page

https://code.google.com/archive/p/multiwii/

[MultiWii]參考文章



http://rcinterest.blogspot.tw/2013/10/multiwii.html

http://rcinterest.blogspot.tw/2013/10/multiwii_11.html

注意每個電變都內含 BEC (電池電壓轉換器,其實就是一個 5V 穩壓器),所以只能有一個電變是提供 5V 給接收跟 MWC 的,另外三個電變的紅線必須拆掉,免的四個 5V 輸出短接在一起。對了,在把這四個電變接上 MWC 之前,最好先一個個直接接在接收機上做油門校正,這樣四個電變的油門才會一致,油門校正的方法要看電變的說明,一般是把遙控器油門調到最高再接上電變電池,聽到嗶嗶聲後再把油門壓到最低,這樣電變就知道了油門的最大及最小值。

http://rcinterest.blogspot.tw/2013/10/multiwii_3701.html

[Arduino]PWM


TC0 - 8-bit Timer/Counter0 with PWM
TC1 - 16-bit Timer/Counter1 with PWM
TC2 - 8-bit Timer/Counter2 with PWM and Asynchronous Operation


Timer/Counter 0, 1 Prescalers
The 8-bit Timer/Counter0 (TC0) , 16-bit Timer/Counters 1 (TC1) share the same prescaler module, but the Timer/Counters can have different prescaler settings. The following description applies to: TC0 , TC1 .




以下內容來自這裡

大家都知道在 Arduino UNO 有六支 pin 可以使用 analogWrite( )做 PWM 輸出,
在板子上 pin 旁邊標示有 "~" 符號, analogWrite( ) 可以用來產生模擬電壓,
很多人一定很好奇那是怎麼做到的 ?

首先來看看 PWM 模擬電壓的原理, 這在官網上就有解說了:
     http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM
所謂的 PWM 全稱是 Pulse-Width Modulation (PWM), 其實這也沒啥學問,
就是對 GPIO 腳位不斷的切換 "有電" "沒電", 
每秒鐘循環幾次即為其 Frequency(頻率), 
每次"有電"時間佔一個循環的百分比稱為其佔空比(Duty cycle);
以下是官網上的模擬範例:
int pin = 13;
void setup() {
  pinMode(pin, OUTPUT);
}
void loop(){
  digitalWrite(pin, HIGH);
  delayMicroseconds(100); // Approximately 10% duty cycle @ 1KHz
  digitalWrite(pin, LOW);
  delayMicroseconds(1000 - 100);
}
這個範例中, 一個循環是 1000 us = 1ms, 所以一秒循環 1000次, 因此 Frequency 是 1 KHz,
每個循環中, 有電的比率是 100/1000 * 100% = 10%, 所以 duty cycle (佔空比)為 10%;
這樣就可以模擬出 5Volt x 10% = 0.5 Volt 的電壓!
    如果真的這樣做, 有好處也有壞處, 官網上已經說了:
好處是任一支 pin 都可這樣用, 包括 Pint 0 到 Pin 13, 以及 Pin A0 到 A5 共 20支 pin 都可以!
壞處卻更多, 首先就是頻率(Frequency)和佔空比(duty cycle)可能受中斷(Interrup)的影響變成不是很準確 !!
最大的壞處是, 在某支 pin 做 PWM 輸出期間都沒辦法做別的事情 !!

    既然說這只是示範可以這樣做, 在  Arduino 當然不可能是這麼做,
那 Arduino 是怎麼做的呢?

就是透過 Timer 計時器直接控制 pin 做 PWM 輸出, Arduino UNO 的 MCU 有三個 timer,
其中 timer0 控制 pin 5, pin 6; timer1 控制 pin 9, pin 10; timer 2 控制 pin 11, pin 3;
所以, 我們可以對這些 pin  analogWrite(pin, val); 輸出 0 到 255(2的8次方,8Bit) 的 val 值到 pin ;
如果輸出 val 是 0, 它會偷偷直接改用 digitalWrite(pin, 0); 輸出,
如果 val 是 255, 也是會偷偷直接改用 digitalWrite(pin, 1); 輸出!
如果 val 是 1 到 254, 則會下命令請 pin 腳對應的 timer 計時器(定時器)幫忙!!
How ?
首先要知道 timer 的基本知識:
(1)每個 timer 一定有個 counter, 例如 timer0 的TCNT0, timer1 的TCNT1, timer2 的TCNT2;
   該 counter 一定是每個 tick 會加 1, 每個 tick 通常是把 CPU 的 clock 拿來經過一個除頻電路,
   然後給 timer 使用; Arduino UNO 採用 AVR ATmega328 MCU, 且 clock Rate 是 16MHz,
   每個 timer 的除頻 Prescaler 是獨立設定的, 通常可以設 1, 2, 4, 8, 64, 256, or 1024 等,
   這必須看 MCU 的 datasheet.

(2)每個 timer 通常提供許多 mode 運作模式, 例如 counter 溢出(Overflow)或Rollover歸零時產生中斷,
   或 TCNT? 達到某個值時產生中斷等, Arduino ATmega328 的 timer 有 16種 mode, 許多 Mode 是與 PWM 有關;
   要設定 timer 的 Mode 可以透過修改 timer 的控制暫存器, 例如 TCCR?A, TCCR?B,    注意以 ATmega328 為例, TCCR?A 和 TCCR?B 要合起來用, 此處的 A, B 與 channel A, channel B 無關!!

(3)每個 timer 通常有比較暫存器(Compare Register), 當 TCNT? 值與該些比較暫存器相同時可以做某事,
   不一定是對 CPU 產生中斷! Arduino 每個 timer 有兩個比較暫存器, 分別命名 OCR?A 和 OCR?B,
  其中 ? 是 0, 1, 2 分別對應到 timer0, timer1, 和 timer2 這三個計時器.
你可以先偷看 analogWrite( ) 的程序碼:
    在你 Arduino IDE 下的 hardware\arduino\cores\arduino\wiring_analog.c
很簡單, 真正請 timer 幫忙只做三件事: a.找出對應的 port, b.設定控制暫存器, c.填入 analog的值到比較暫存器!
不過你會發現看不太懂, 因為還不知道硬體 timer 控制 PWM 運作方式與原理!
不想看 datasheet 可以參考這:
      http://letsmakerobots.com/conten ... mers-and-interrupts

    以Arduino UNO 的 timer1為例, 在 mode 5 (Fast PWM, 8 bit), 此時, TCNT1 從 0 數到 255, 然後又加 1 就變0, ...
通常從 255 (此 mode 的最大值)又加 1 變為 0 之時會產生 OVF 中斷(TIMSK1的TOIE1要 set), 不過這與 PWM 無關!
PWM 不是用 Interrupt  中斷請求做的, 不必麻煩 CPU, CPU 只要下命令給 timer, timer 就會照命令執行PWM工作 !!
    PWM 是利用每個 timer 上的兩個"匹配符合輸出"暫存器(Compare Match Output) COM?A 和 COM?B;
(注意雖是 Compare Match Output, 但暫存器名稱是 COMxy 不是 CMOxy 喔 !)
在timer1 的 mode 5, 又稱 Fast PWM mode, (不過請注意 Arduino 的 init( ) 設定只有 timer0 用這, 另外 timer1 和 timer2 不是用這 mode),
這時可以把 1 到 254 之間的值放入 OCR1A 或 OCR1B 以便控制 pin 9 或 pin 10
的 PWM duty cycle, 1 到 254 分別對應到 (1+1)/256, .., (254+1)/256 的 duty cycle.

會 +1 是硬體電路設計上的關係, data sheet 上說:
   Note that fast PWM holds the output high one cycle longer than the compare register value.
在 TCNT1 等於 0  之時, COM1A and/or COM1B 會輸出(當然要 TCCR1A 內的 COM1A1 and/or COM1B1 有set),
然後在 TCNT1 等於 OCR1A 則關閉 COM1A, 當 TCNT1 等於 OCR1B 則關閉 COM1B,
注意沒有立即關閉, 是延遲一個 tick 才關閉 ! 所以才會多加1, 因為一個循環是 256, 不是 255,如果不延遲加 1, 則輸出 val 是 254 時變成 254/256, 還差一點點, 所以犧牲 1/256, 就是沒有 1/256佔空比 !!

   由於 Arduino 的 init( )把 timer1 的 Prescaler 設定為 64,
(參考在你 Arduino IDE 內的   hardware\arduino\cores\arduino\wiring.c )
且把 timer1 設定為 8-bit phase correct pwm mode, 所以其頻率是 490.196Hz, 不是 976.5625Hz;
   所謂的 8-bit phase correct pwm mode, 意思是 TCNT? 從 0 數到 255, 接著又從 255 倒著數回 0,
那何時把 COM1A and/or COM1B 的輸出打開或關閉呢?

根據 datasheet, 在從 0 往上數, 碰到 OCR1A 時把 COM1A 關閉,
後從 255 往回數, 數到 OCR1A 時把 COM1A 打開(有電); 對於 OCR1B 和 COM1B 也是這樣!
這使得 duty cycle (佔空比) 更準確, 也就是 val 1 ~ 254 分別對應到 1/255 到 254/255 的 duty cycle.
但是 Frequency 則不是除以 256, 是要除以 255 再除以 2, 於是: (注意是 255, 不是 256喔!)
Frequency = 16 MHz / 64 / 255 / 2 = 490.196Hz;
timer 2 也是在 init( )被設為 Prescaler 64 的 phase correct pwm (8-bit);
但是, timer0 雖然 Prescaler 也設 64, 但 PWM 是用 Fast PWM mode,
不使用 phase correct mode 是為了避免影響維護 millis( ) 的中斷 timer0 Overflow Interrupt,
ISR(TIMER0_OVF_vect) 這中斷處理程序, 否則 millis( ) 和 micros( ) 以及 delay() 都會受到影響 !!
因此 , timer0 控制的 PWM 其 Frequency 是 976.5625Hz,
    16 MHz / 64 / 256 = 976.5625Hz
注意用 timer0 控制的pin 5, pin 6 之 PWM 的 duty cycle 無法是 1/256, 它是 0 再來就 2/256了!
結論:

  timer0 控制 pin 5, pin 6, PWM 頻率 976.5625Hz, duty cycle可以 2/256 ~ 255/256 (對應 1 到254);
  timer1 控制 pin 9, pin 10, PWM 頻率 490.196Hz, duty cycle 可以 1/255 ~ 254/255(對應 1 到254);
timer2 控制 pin 11, pin 3, PWM 頻率 與 duty cycle 跟 timer1 控制的相同 !!

Q: 那 PWM 的 Frequency 可不可以更改?
A: 可以, 偷改 timer 的 Prescaler 就可以達到更改 Frequency 的目的 !
   但是, 千萬不要更改 timer0 的 Prescaler, 否則 millis( ) 和 micros( ) 以及 delay() 都會受到影響 !!!
   以下是以 timer1 控制的 pin 9, pin 10 為例(注意兩個 pin 的頻率相同!)
   在你的 setup( ) { 內, 寫如下兩句即可:
      int fff = 3;  // 可以是 1, 2, 3, 4, 5
      TCCR1B = TCCR1B & 0xF8 | fff;
  其中 fff 與對應頻率如下:
  fff   Prescaler   Frequency
   1           1        31372.549 Hz
   2           8          3921.569
   3         64            490.196   <--DEFAULT
   4       256           122.549
   5    1024               30.637 Hz

至於 timer2 控制的 pin 11 和 pin 3,
則在 setup( ) { 內寫:
     TCCR2B = TCCR2B & 0xF8 | ?;
此處的 ? 可以有七種:
   ?  Prescaler   Frequency
   1         1       31372.549 Hz
   2         8         3921.569
   3            32          980.392
   4        64         490.196   <--DEFAULT
   5      128         245.098
   6      256         122.549
   7    1024           30.637 Hz

如果你堅持要改 timer0 的 Prescaler, 以更改 pin 5, pin 6 的 PWM 頻率:
   (注意 millis( ) 和 micros( ) 以及 delay() 都會受到影響 !! )
則在 setup( ) { 內寫:
     TCCR0B = TCCR0B & 0xF8 | ?;
此處的 ? 可以有五種:
   ?  Prescaler   Frequency
   1          1       362500 Hz
   2          8           7812.5
   3        64             976.5625   <--DEFAULT
   4      256             244.140625
   5    1024               61.03515625 Hz

參考:
   http://playground.arduino.cc/Main/TimerPWMCheatsheet
   http://www.atmel.com/Images/doc8161.pdf

[Arduino]ADC input voltage


輸入電壓範圍
ADC input voltage range Vcc~0V,這裡VCC為5V
解析度0~1023,
10Bit
The device features a 10-bit successive approximation ADC.



2016年10月18日 星期二

[Arduino]Quadcopter


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

http://diydrones.com/profiles/blogs/arduimu-quadcopter-part-iii

http://www.robotshop.com/blog/en/make-uav-lesson-1-platform-rtf-arf-kit-custom-13989

http://kitsprout.logdown.com/?page=3

http://csenichijou.blogspot.tw/2014/03/Quadcopter-1.html

MPU-9250 and Arduino (9-Axis IMU)
http://www.lucidarme.me/?p=5057

http://diydrones.com/forum

http://www.instructables.com/id/DIY-Drones/


https://hom-wang.gitbooks.io/quadcopter/content/

2016年10月12日 星期三

[Ardunio]四軸飛行機工作坊



http://www.techbang.com/posts/46439-course-real-workshop-arduino-four-axis-aircraft-unmanned-aerial-vehicle-hardware-wireless-remote-control-flight-instruction-flight-control-software-integration-society

2016年10月7日 星期五

[git]rebase


之前不懂rebase的問題在哪
今天看了一下下面文章,大致明瞭
https://git-scm.com/book/zh-tw/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E8%A1%8D%E5%90%88

基本上,Rebase有點像悔改自己的修改歷程,

假設你由公司伺服器的git倉庫克隆了一份master在自己電腦上,

這個時間點我們先訂為時間點一。

你奮鬥了一陣子,
過程是將為了某個issue,你從master取出branch 1去解決這個issue,
而原本的master因為你也有繼續的項目而前進到branch 2,
當issue解完,branch 1要合併回去master時,就會合併到branch 2,我們將這個時候的branch 2叫做branch 3,而master這時就是branch 3。
這樣的過程叫merge。

在這時,我們再暫停一下,這個時間先稱為時間點二。


當你後來發現這樣的岔開方式太繁瑣時,改成使用rebase功能將branch 2的內容在branch 1裡重演一次,生成了branch 2',這時原本的branch 3就不見了。

在這時,我們再暫停一下,這個時間稱為時間點三。

如果到目前為止你都沒有將你的master push回去公司伺服器裡的git倉庫,那天下太平。


會造成問題的例子如下:

讓我們回到時間點一,你同事也在這時候克隆了一份努力工作,
生成了branch 4,

故事繼續走到你奮鬥了一陣子,到了時間點二,你將master push回git倉庫,
你同事盡責的將你的成果同步到他的電腦裡,基於你的branch 3基礎,繼續開發。
並生成了branch 5

故事繼續走到時間點三,你將rebase的結果push回去,
你同事繼續盡責的將你的成果同步到他的電腦裡,
並生成了branch 6,

這時候,你同事就會看到,branch 6裡面有branch 2以及branch 2'的內容,因為branch 2以及branch 2'有兩個不同的SHA-1 校驗值,並不會被取代掉,這兩個內容一模一樣的branch會造成同事莫大的困擾,如果你只有一個工作夥伴,那可能還好解決.....

如果你有許多的工作夥伴,試想每個夥伴的branch裡面都出現莫名其妙的內容時,
那把火會燒得有多旺。

所以,除非你很清楚倉庫裡的來龍去脈,也能很清楚讓別人了解Rebase了什麼,
否則,不要輕易Rebase。









2016年9月25日 星期日

[Robot]人工筋肉



http://sa.ylib.com/MagCont.aspx?Unit=featurearticles&id=327


http://www.eamex.co.jp/features/koubunshi/koubunsi/

2016年8月28日 星期日

[Arduino]Day-10-Timer1



要記得將TimerOne解壓到Libiary資料夾裡面
基本上,可以從序列埠看到一秒顯示一次

Ardunio只有三個Timer
分別為Timer0,1,2
其中0是8bit,1是16Bit,2是8Bit



////////////////////////////////////////////////

#include <TimerOne.h>

int Timer_count = 0;

void setup()
{
  Serial.begin(9600);
  Serial.println("Serial ready" ) ;

  Timer1.initialize(1000000); // 1000000 = 1sec, set a timer of length 1 sec
  Timer1.attachInterrupt( timer_1_Isr ); // attach the service routine here

}
/// --------------------------
/// Loop Routine
/// --------------------------
void loop()
{
}

/// --------------------------
/// Custom ISR Timer Routine
/// --------------------------
void timer_1_Isr(void)
{
  Timer_count++;
  Serial.print("Timer_count = ");
  Serial.println(Timer_count);

}


http://playground.arduino.cc/Code/Timer1
https://oscarliang.com/arduino-timer-and-interrupt-tutorial/
http://coopermaa2nd.blogspot.tw/2011/07/41-blink-with-timer.html

[Arduino]Day-10-UNO-Hardware


Technical specs
MicrocontrollerATmega328P
Operating Voltage5V
Input Voltage (recommended)7-12V
Input Voltage (limit)6-20V
Digital I/O Pins14 (of which 6 provide PWM output)
PWM Digital I/O Pins6
Analog Input Pins6
DC Current per I/O Pin20 mA
DC Current for 3.3V Pin50 mA
Flash Memory32 KB (ATmega328P)
of which 0.5 KB used by bootloader
SRAM2 KB (ATmega328P)
EEPROM1 KB (ATmega328P)
Clock Speed16 MHz
Length68.6 mm
Width53.4 mm
Weight25 g


https://www.arduino.cc/en/Main/ArduinoBoardUno

2016年8月20日 星期六

[Arduino]Day-9-超音波加伺服馬達








程式碼
=========================================================

#include <Servo.h>
#define Servo_Pin      7  // 定義伺服馬達輸出腳位(PWM)
#define servo_delay    5  // 伺服馬達轉向後的穩定時間
Servo myservo;            // 宣告伺服馬達變數
int val = 0;
int Count_up = 1;

// Ultrasonic
int ECHO_Pin=2;  // ultrasonic ECHO
int TRIG_Pin=3; // ultrasonic TRIG
int distance = 0;

// initial
int Ini_Flag = 0;

void setup()
{
  Serial.begin(9600);
  pinMode(ECHO_Pin, INPUT);
  pinMode(TRIG_Pin, OUTPUT);
  myservo.attach(Servo_Pin);

  //
  val = 90;
  testServo(val);
  delay(3000);
  Serial.println("Servo 90 and serial ready" ) ;
  //
}
void loop()
{

//   //給安裝伺服馬達時的初始校正
//  if(Ini_Flag == 0)
//  {
//    testServo(0);
//    delay(3000);
//    testServo(180);
//    delay(3000);
//    testServo(90);
//    delay(5000);
//    Ini_Flag = 1;
//  }
  if(Count_up)
  {
    val+=1;
    if(val >= 170)
    {
      Count_up = 0;
    }
  }else{
    val-=1;
    if(val <= 9)
    {
      Count_up = 1;
    }
}
testServo(val);
distance = Get_Distance();
Serial.print("motor = ");
Serial.print(val);        //Output val
Serial.print(" distance = ");   //Output
Serial.println(distance);

}

int Get_Distance(void)
{
  digitalWrite(TRIG_Pin, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_Pin, HIGH); // Pulse for 10 micro sec to trigger ultrasonic detection
  delayMicroseconds(10);
  digitalWrite(TRIG_Pin, LOW);
  int distance = pulseIn(ECHO_Pin, HIGH);  // Read receiver pulse time
  distance= distance/58;   // Transform pulse time to distance
  return distance;
}

void testServo(int angle)
{
  myservo.write(angle);
  delay(servo_delay);  // 等待伺服馬達穩定
}


[轉貼]Arduino:stk500_getsync(): not in sync

下午也同樣發生這狀況,後來是燒錄時不能用腳位0與1。

燒錄時,若看到錯誤訊息「avrdude: stk500_getsync(): not in sync: resp=0x00」,雖然知道這代表著電腦端的燒錄程式avrdude不能與微控制器內的bootloader進行溝通,但卻無法知曉錯誤的源頭在哪,因為可能出錯的地方太多了。

底下列出可能導致此錯誤的原因,以及解決辦法:

原因:「工具-板子(Tools-Board)」與「工具-序列埠(Tools-Serial Port)」沒選好 
辦法:確認你的板子到底是哪一塊,確認它所連接的序列埠是哪一個,重新設定正確的值

原因:序列埠被佔用了
辦法:關閉佔用序列埠的軟體,或電腦重開機

原因:驅動程式壞了、沒裝好
辦法:重新安裝驅動程式 

原因:零件影響了燒錄所需的線路,譬如Uno板燒錄時須經由腳位0與1的線路
辦法:燒錄時拔除相關接線、暫時先拔掉擴充板

原因:舊板子與某些較小型的板子,需要自己按板子上的Reset鍵
辦法:觀看avrdude燒錄時輸出的訊息,在適當的時機按下Reset鍵;多試幾次,嘗試在不同的時間點按下

原因:若是自己買「USB轉Serial介面」模組再加上微控制器晶片,有可能TX與RX接反了
辦法:反過來接試試看

原因:微控制器裡的bootloader壞了,或根本沒有bootloader
辦法:找個ISP燒錄器,重新燒錄bootloader

原因:不明
辦法:電腦重開機

原因:不明
辦法:重新啟動Arduino IDE

原因:不明
辦法:重新拔插USB連接線

原因:不明
辦法:換插別的USB埠

原因:不明
辦法:改用USB集線器或改為直接插電腦的USB埠

原因:不明
辦法:換條USB線


出處
http://yehnan.blogspot.tw/2014/10/arduinostk500getsync-not-in-sync.html

[轉貼]Cooper Maa: 超棒的 Arduino pinout diagrams

Cooper Maa: 超棒的 Arduino pinout diagrams: 有個叫 Pighixxxx 的義大利人,最近製作了好多 Arduino 的 pinout diagrams 貼在 Arduino forum 上,有 Arduino UNO 的,有很多張 ATMega 的,例如 ATMega328 與 ATMega1284p 等,也有幾張是 A...

//筆記
Cooper Maa是個神人,他的部落格有許多玩Ardunio的玩家值得去看的文章,
這篇應該算是很有用的


Mega版本
http://forum.arduino.cc/index.php/topic,146511.0.html





[Arduino]Day-9-servo_test2


今天得要一個人在家顧女兒,
因為女兒哭鬧不止,只能一手抱在腿上,一手coding,
弄完,拍好片上傳,貼上影片跟原始碼後,
突然發現....
女兒已經打呵欠了,
呵呵,
果然程式對女兒還是沒有吸引力的。
不過女兒倒是盯著轉來轉去的馬達一陣子,
大概3分鐘吧...
抱去睡覺後,現在來補充一下這篇裡面的文字

在這實驗裡面發現,delay不加也是能跑,而且感覺不出來比較快,

另外,透過序列埠,之後可以將資料回傳,再用VC或其他軟體接資料來畫圖,
下一步想將超音波資料讀回來。





=======================================================
#include <Servo.h>

#define Servo_Pin      2  // 定義伺服馬達輸出腳位(PWM)
#define servo_delay    15  // 伺服馬達轉向後的穩定時間
Servo myservo;            // 宣告伺服馬達變數
int val;
int Count_up = 0;
void setup()
{
  myservo.attach(Servo_Pin);
  Serial.begin(9600);//
  Serial.println("servo=o_seral_simple ready" ) ;
}

void loop()
{
if(Count_up)
{
  if(val == 179)
  {
    Count_up = 0;
  }
  val++;
}else{
   if(val == 0)
   {
    Count_up = 1;
   }
   val--;
}
testServo(val);

}

 void testServo(int angle)
 {
  Serial.print("moving servo to ");
  Serial.print(angle,DEC);
  Serial.println();
  myservo.write(angle);
  delay(servo_delay);  // 等待伺服馬達穩定
 }

2016年8月19日 星期五

[Arduino]Day-8-Servo_Motor


利用Com埠送控制命令
控制Servo Motor

一如往常,組機構與找螺絲鎖孔的時間占了九成....

機構孔徑大小不合,鎖孔位置只能將就,基本上就是能鎖就好,其他就不要多要求。





=======================================================
#include <Servo.h>

#define MotorA_in1     8  //定義 馬達A in 1
#define MotorA_in2     9  //定義 馬達A in 2
#define MotorB_in1    10  //定義 馬達B in 1 to L298N IN3
#define MotorB_in2    11  //定義 馬達B in 2 to L298N IN4
#define MotorA_PWNA    5  //定義 ENA (PWM) 接腳
#define MotorB_PWNB    6  //定義 ENB (PWM) 接腳

// 伺服馬達(舵機)
#define Servo_Pin      2  // 定義伺服馬達輸出腳位(PWM)
#define servo_delay  250  // 伺服馬達轉向後的穩定時間
Servo myservo;            // 宣告伺服馬達變數
int val;
int dir;
void setup()
{
  pinMode(MotorA_in1,OUTPUT);
  pinMode(MotorA_in2,OUTPUT);
  pinMode(MotorB_in1,OUTPUT);
  pinMode(MotorB_in2,OUTPUT);
  pinMode(MotorA_PWNA,OUTPUT);
  pinMode(MotorB_PWNB,OUTPUT);

  myservo.attach(Servo_Pin);
  Serial.begin(9600);//
  Serial.println("servo=o_seral_simple ready" ) ;
}

void loop()
{

val=Serial.read();//
if(val>'0'&&val<='9')
{
  val=val-'0';
  dir=val*(180/9);//
  Serial.print("moving servo to ");
  Serial.print(dir,DEC);
  Serial.println();
  myservo.write(dir);
  delay(servo_delay);  // 等待伺服馬達穩定
}
}

2016年8月17日 星期三

[Arduino]Day7-L298N直流馬達驅動



測試L298N




#define MotorA_in1     8  //定義 馬達A in 1
#define MotorA_in2     9  //定義 馬達A in 2
#define MotorB_in1    10  //定義 馬達B in 1 to L298N IN3
#define MotorB_in2    11  //定義 馬達B in 2 to L298N IN4
#define MotorA_PWNA    5  //定義 ENA (PWM) 接腳
#define MotorB_PWNB    6  //定義 ENB (PWM) 接腳

void setup()
{
  pinMode(MotorA_in1,OUTPUT);
  pinMode(MotorA_in2,OUTPUT);
  pinMode(MotorB_in1,OUTPUT);
  pinMode(MotorB_in2,OUTPUT);
  pinMode(MotorA_PWNA,OUTPUT);
  pinMode(MotorB_PWNB,OUTPUT);
}

void loop()
{
    // 直走
    analogWrite(MotorA_PWNA,200);   //設定直流馬達轉速
    analogWrite(MotorB_PWNB,200);
    digitalWrite(MotorA_in1,HIGH);   //直流馬達(右)順時針轉動
    digitalWrite(MotorA_in2,LOW);
    digitalWrite(MotorB_in1,HIGH);   //直流馬達(左)逆時針轉動
    digitalWrite(MotorB_in2,LOW);
    delay(2000);

    //後退
    analogWrite(MotorA_PWNA,200);   //設定直流馬達轉速
    analogWrite(MotorB_PWNB,200);
    digitalWrite(MotorA_in1,LOW);    //直流馬達(右)逆時針轉動
    digitalWrite(MotorA_in2,HIGH);
    digitalWrite(MotorB_in1,LOW);    //直流馬達(左)順時針轉動
    digitalWrite(MotorB_in2,HIGH);
    delay(2000);

    //左轉
    analogWrite(MotorA_PWNA,80);    //設定直流馬達轉速
    analogWrite(MotorB_PWNB,80);
    digitalWrite(MotorA_in1,HIGH);   //直流馬達(右)順時針轉動
    digitalWrite(MotorA_in2,LOW);
    digitalWrite(MotorB_in1,LOW);    //直流馬達(左)順時針轉動
    digitalWrite(MotorB_in2,HIGH);
    delay(2000);

    //右轉
    analogWrite(MotorA_PWNA,80);     //設定馬達轉速
    analogWrite(MotorB_PWNB,80);
    digitalWrite(MotorA_in1,LOW);    //馬達(右)逆時針轉動
    digitalWrite(MotorA_in2,HIGH);
    digitalWrite(MotorB_in1,HIGH);   //馬達(左)逆時針轉動
    digitalWrite(MotorB_in2,LOW);
    delay(2000);

    //停止
    digitalWrite(MotorA_in1,HIGH);   //馬達(右)停止轉動
    digitalWrite(MotorA_in2,HIGH);
    digitalWrite(MotorB_in1,HIGH);   //馬達(左)停止轉動
    digitalWrite(MotorB_in2,HIGH);
    delay(2000);
 }

blogger沒有私密文章的現成功能


原來blogger沒有私密文章的現成功能,
必須自己加入HTLML碼
參考
http://www.wfublog.com/2013/06/blogger-private-post.html

看起來無法把讀者分群

[Sensor]MPU92/65

MPU92/65是很久以前買的感測器 基本上有加速度計、陀螺儀、電子羅盤、溫度計 以下是該電子商城的介紹 https://www.factoryforward.com/product/gy-87-mpu-9265-3-axis-9-dof-attitude-gyro-magnet...