2009年4月21日 星期二

官方及非官方函式庫

轉貼自 http://arduino.cc

Official Libraries
These are the "official" libraries that are included in the Arduino distribution.

* EEPROM - reading and writing to "permanent" storage
* Ethernet - for connecting to the internet using the Arduino Ethernet Shield
* Firmata - for communicating with applications on the computer using a standard serial protocol.
* LiquidCrystal - for controlling liquid crystal displays (LCDs)
* Servo - for controlling servo motors
* SoftwareSerial - for serial communication on any digital pins
* Stepper - for controlling stepper motors
* Wire - Two Wire Interface (TWI/I2C) for sending and receiving data over a net of devices or sensors.

These libraries are compatible Wiring versions, and the links below point to the (excellent) Wiring documentation.

* Matrix - Basic LED Matrix display manipulation library
* Sprite - Basic image sprite manipulation library for use in animations with an LED matrix

Contributed Libraries
Libraries written by members of the Arduino community.

Communication (networking and protocols):

* Messenger - for processing text-based messages from the computer
* NewSoftSerial - an improved version of the SoftwareSerial library
* OneWire - control devices (from Dallas Semiconductor) that use the One Wire protocol.
* PS2Keyboard - read characters from a PS2 keyboard.
* Simple Message System - send messages between Arduino and the computer
* SSerial2Mobile - send text messages or emails using a cell phone (via AT commands over software serial)
* X10 - Sending X10 signals over AC power lines

Sensing:

* Capacitive Sensing - turn two or more pins into capacitive sensors
* Debounce - for reading noisy digital inputs (e.g. from buttons)

Displays and LEDs:

* GLCD - graphics routines for LCD based on the KS0108 or equivalent chipset.
* LedControl - for controlling LED matrices or seven-segment displays with a MAX7221 or MAX7219.
* LedControl - an alternative to the Matrix library for driving multiple LEDs with Maxim chips.
* LedDisplay - control of a HCMS-29xx scrolling LED display.

Motors and PWM:

* Servo - provides software support for Servo motors on any pins.
* TLC5940 - 16 channel 12 bit PWM controller.

Timing:

* DateTime - a library for keeping track of the current date and time in software.
* Metro - help you time actions at regular intervals
* MsTimer2 - uses the timer 2 interrupt to trigger an action every N milliseconds.

Utilities:

* TextString aka String - handle strings
* PString - a lightweight class for printing to buffers

參考網址:
Libraries

在Arduino下將數字(int)轉字元(char)的方法

因為想把數值利用1602 lcd顯示, 結果lcd4bit只提供printIn(char*)的函數, 只好找將int轉char的方法.

很久沒用c或c++來寫程式了, 用慣了方便的java, 再回頭都不會寫c程式了, 再加上arduino的限制, 簡值不知要如何下手, 還好這些問題不是什麼艱難問題,隨便找了一下就找到答案了,原來還是可以用atoi() 及itoa()的 function, 奇怪, 我一直以為只有官方手冊上列的那些函數才可以用, 看樣子一些c的函數也是可以用的樣子, 不過似乎size是最大的關鍵, 看到sprintf也可以用, 但要加上1.5k的size, 哇, 程式才2k多, 加用一個sprintf()竟然要多1.5k, 看起來這應該是要改寫程式習慣的最大不同處吧...

參考網址如下:
n00bie qustion about converting INT to CHAR

example:
----------------------------------------------------------------------------------------------------------------
char value2[4] ;

int value1 = analogRead(analogpin0); // reads the value 0-1023
delay(100); // this small pause is needed between reading two

lcd.clear();
itoa (value1, value2, 10);
lcd.printIn(value2);

Ubuntu 8.10下 亂數 random() 不能動作的問題

試著控制 1602 lcd , 直接使用 LCD4bit 的4線控制, 線接好之後, 在ide打開 LCD4bit內附的example程式, 上傳, 哇, 幾行程式竟然就可以做出這樣的效果, 真是令人驚奇的東西...

不過, 看著它跑了好一會兒, 咦! 怎麼怪怪的, 明明用亂數取6個字串之一來顯示, 為什麼永遠只出現1,4 二個字串, 一開始不以為意, 時間久了, 就覺得好像有問題, 雖然說ramdom()都會提說這不是真正的亂數, 這點我瞭解, 之前在做寫排隊理論時, 就有為這問題, 另外寫過一個亂數程式, 不過好像跟這問題無關, 明明都是一直不斷電在run, 不存在亂數重覆的問題, 於是試著加 randomSeed() 去修改亂數種子, 但仍沒改善, 再把ramdom() 取值範圍加大, 情況好一些, 但幾個值之後還是開始重覆循環.

最後死心上網找答案, 很快就發現這狀況只會出現在特定的環境下, 原來是compiler的問題, 這真的很詭異, 直正執行程式不是在單晶片上面嗎? 為什麼compile出問題會導至單晶片執行錯誤, 是因為編譯成錯誤的machine code嗎? 在window下安裝了一個新的arduino ide環境, 用同一個範例程式, 編譯上傳, 哇 沒問題了, 真是長見識了, 沒想到問題竟然會出現在這裡, 真是意想不到, 找到一些說明, 主要的原因應該是 avr-gcc 4.3.0 的bug, 換掉這個版本應該就ok了, 不過偷懶把debain的源加上之後, 要更新的部份相當多, 想想就先算了, 明天(4/23) 9.04要發表了, 也許這個版本就會更新了, 這個問題就自然被解決了

lcd4bit控制參考網址:
The 4-bit Arduino LCD library
Arduino控制2x16 LCD (使用LCD4Bit Library)
機器人●夢-Arduino&LCD1602

問題解決參考網址如下:
Help - Random function not working
RE: [avr-libc-dev] bug in rand()/random()/do_rand()/do_random( )

package下載位置:
http://packages.debian.org/

底下是網路上找到解決的方法, 據描述, 應該換掉 binutils-avr, avr-libc, gcc-avr 3個套件應該就ok了
-------------------------------------------------------------------------------------------------------------------------
Ubuntu 8.10 (Intrepid Ibex)
avr-libc 1:1.6.2-1
avr-gcc 1:4.3.0-2
Maintainer: Ubuntu MOTU Developers
Linux main 2.6.27-11-generic #1 SMP Fri Dec 19 16:29:35 UTC 2008 x86_64
GNU/Linux

but when she installs the following files from debian sid, it fixes the
problem:

binutils-avr_2.18-4_amd64.deb
avr-libc_1.6.2.cvs20080610-2_all.deb
gcc-avr_4.3.2-1_amd64.deb

2009年4月20日 星期一

AVR USBAsp 下載線製作使用記要

一連做了好幾個AVR的下載線( IN-System Programming, 一直覺得這個名詞翻譯得很爛, 從字面上完全不知道它的用途) , 最穩定的還是print port的下載線(並口下載線, 每次看到並口或串口時都要想一下), 雖然也做壞了2,3個, 不過ok之後, 倒是燒得很穩定,就是速度慢了些.
之後再做了serial port的下載線, 電路簡單, 用洞洞板直接焊ok線就好了, 不過, 在測試時卻糟遇問題, 一直到後來才發現不能再像之前做print port時, 另外加一個led測試電路, 直接把測試電路去除就ok了...

當已經有能力可以燒atmega8後, 最後終於開始做使用atmega8的usbasp(這真的很吊詭,要做avr的下載線,我還得先去想辨法把usbasp的firmware燒進atmega8,才有辨法做usbasp的下載線, 這不是逼人家一定要先去做一個print port或serial port的下載線嗎??)

都已經做完了,實在懶得把過程重新key上來, 看來我是不適合寫blog.. :)

總之, 在電路方面, 記得在usb的 d+,d- 2條線上加 3.6v稽納二極體接地來穩壓, 否則不是每台電腦都能偵測到這個usbasp下載線, 在window driver部份, 使用官網的最新驅動程式2009/02/28會導至一些自製的燒錄程式無法找到這個usbasp, 像 progisp, avr-fighter 等等, 但使用 avrtude-gui 倒是很穩定都認得. 至於firmware倒是沒限制, 使用最近被燒錄可以正常動作.

在燒錄方面, 燒 atmega168都(使用外部4hmz晶振)沒問題, 直接對燒 usbasp也沒問題 (使用外部12mhz晶振), 但燒錄atmega8時, 卻會發生找不到晶片的問題, 這時把usbasp jp3 short, 選擇低速燒錄後則沒問題, 但若將熔絲設成 usbasp建議的 c9 ef 後, 不管jp3有沒有short, 都無法認得晶片, 非得改用外部晶振12mhz的燒錄板才行, 當將熔絲設成atmeag8 deault後, 則再次使用外部4mhz晶振時, 則沒有問題. 推測絕對跟熔絲值設定有關, 不過, 真的懶了, 暫時用不到, 就先擱著吧.