2010年4月13日 星期二

自製蝕刻機

雖然洗版子的量不大, 而且現有的工具也頗方便, 但一直想要專業方便一點, 像曝光機, 蝕刻機等等, 不過像蝕刻機一台就要1,200多元, 明明就是一個壓克力容器加上養魚的打氣機及加溫棒, 竟然要這麼貴, 實在買不下去, 前陣子在買曝光機要用的黑燈管時, 意外發現水族業也用黑燈管來養螢光魚, 所以乾脆順便把打氣機跟加熱棒也買了回來, 就差容器還沒有下落.



後來在露天意外發現有人在賣壓克力片, 就花了近3佰元買了3片A4 大小的壓克力回來,

準備開始自製蝕刻機, 不過卡在找不到壓克力膠, 怕作出來的蝕刻機會漏水, 一直就擱置下來, 直到在新莊好朋友商場買了防水的AB膠後, 趁週末就開始動工.

一開始心裡認為鋼鋸太粗, 可能不適用, 所以拿出電磨機想用切割的方式, 搞了好久, 切沒幾公分, 後來改用鋸電路板的小鋸子, 但那小鋸最多只能鋸10公分, 超過的部份, 只好用手拿鋸條慢慢鋸, 折騰了好久, 手也痛死了, 總算鋸下第一片料, 但歪七扭八, 只能用慘不忍睹來研容, 後來火大, 找出鋼鋸, 才發現沒我想像的粗, 刷刷刷, 沒幾分鐘, 第二片料就割下來了, 切口還很平整, 剩下的料, 就在懊腦中, 沒幾分鐘就全部鋸完了.. Orz

待續....

2009年7月29日 星期三

SOIC轉DIP USB疑似被干擾無法識別裝置的問題

在淘寶買了些ATtiny45準備來實作一些小東西, 但好像是缺貨的樣子, DIP封裝的不是很貴就是缺貨, 想說乾脆自已作一些SOIC轉DIP的轉卡來用好了,感覺不會很難的樣子.
東西到手之後, 利用eagle畫了圖之後, 才發現要作成單面且大小與原DIP差異不大的還真是不太容易, 只好把線寬儘量縮小, 小到我覺得洗版子時一定會造成斷線, 第一次洗, 是沒斷線, 但線都連在一起了, 得用美工刀一條一條去劃開, 這還不是最慘的, 最慘的是竟然忘記水平翻轉了, 還好IC是對稱的, 轉了180度後還是可以用.

第二次修正後跟著其它版子順便重新洗了一些, 也隨手焊了兩個備用.

這兩天開始實作AVR-CDC 裡的cdtiny45V-USB 裡面的示範專案 EasyLogger , 線路都很簡單, cdtiny45甚至只有幾顆電阻與3.6V zenor ,再加上一顆104電容而已, 幾乎不可能有錯的地方, 作出來後本來有找到裝置, 但在用去漬油去清洗後就完全找不到裝置, 實在是很詭異的問題, 雖然想說會不會104燒壞了, 但在重換一顆104後依然沒解決問題.

於是改作EasyLogger, 線路只比cdtiny45多了一顆10uf的電解電容, 感覺比較容易燒壞而已, 但焊完後之後也發生跟cdtiny45一樣的問題, 常常找不到裝置, 只有很偶而的狀況下才找到, 讓我有點懷疑是USB頭有問題.

另外為了方便測試, 也作了一個4pin轉usb type A(公,母), B(母)的轉接頭.

測試過程太冗長了不寫了, 結論是
1.USB轉接頭不能偷懶, 同時串接幾種不同的頭, 很容易干擾, 只能一種頭作一種.
2.最重要的發現, 第一次忘記水平翻轉的SOIC轉DIP板沒有平擾問題, 但第二次作的線路反而有干擾, 這實在令人無力, 這是實驗結果, 但實際是否真如猜測的是因為線路太細太近干擾所致, 還是有其它問題?? 不過這兩種板上的ATtiny45燒錄驗證都很正常, 實在想不通怎麼會有這樣的問題....

---
2009/08/01 更新
根據第一次誤打誤撞作錯的樣式,又重新Layout了一份新的板, 但焊了兩份, 結果依然找不到USB裝置,這實在令人不敢置信, 難道是因為我佈線時有稍為修改間距的關係?? 我覺得不可能是這個原因, 於是仔細回想整個製作過程, 又找到一個不一樣的地方, 我第一次焊時, 是採用一般SMD介紹的堆鍚的方式, 但從第二次開始, 因為覺得堆鍚好像焊得很爛的樣子,所以改用一點一點去焊的方式, 難不成是這個差別?? 於是把第二次失敗的板子重新使堆鍚的方式重焊過, 神奇的事發生了, 竟然全部動作正常... Orz... 再把最後一次作的板子也用堆鍚的方式再焊過....謎題揭曉... 果然是因為銲接方法不同所造成,這下更令人訝異了, 佈線不同造成信號干擾這可以理解, 但銲接方法不同,即使電路測試都沒有短路,也可正常燒錄, 但卻造成USB裝置無法辨識,實在令人沮喪...還好找到問題點了, 儘管匪夷所思, 但記錄下來, 下次 就不會再犯了...

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晶振時, 則沒有問題. 推測絕對跟熔絲值設定有關, 不過, 真的懶了, 暫時用不到, 就先擱著吧.

2009年3月1日 星期日

我的Arduino初體驗

自從意外在癮科技看到arduino後,就喚醒了我心中埋藏已久對電腦操作電子設備的熱愛,