2015年11月25日 星期三

PCB Layout 入門教學(零) ---認識IC零件規格



IC元件主要分為DIP及SMD兩大類, DIP 插件的IC, SMD (Surface Mount Device) 表面黏著元件。



在SMD世界裡,常會聽到 0603, 0805, 1206 指的是什麼? 

指的其實是元件的Package尺寸, 尺寸講的是長(Length)x寬(Width)。使用的單位可以是inch或mm 。一般常講的SMD 的電阻、電容都是用inch來描述元件的尺寸大小。總共4位數表示, 2個位數一組。

0603:  0.06"x0.03", or 60x30 mils, or 1.6x0.8mm   (Note: 1mil=千分之一英寸)
0805:  0.08"x0.05", or 80x50 mils, or 2.0x1.25mm
1206:  0.12"x0.06", or 120x60 mils, or 3.2x1.6mm

2015年11月23日 星期一

PCB Layout 入門教學(三) ---建立Footprint Library


建立Footprint Library


PCB Layout 的工作, 除了佈線以外,另一個工作就是建立元件的footprint。設計footprint在kicad 裡是交由Module Editor這個工具來完成。如果你用了某一個IC或connector , 在既有的kicad 的footprint library 找不到它的footprint話, 那就得自己畫。在kicad裡, 一個footprint也就是一個Module , 一個library 可以包含多個footprint (module)。library 的副檔名為 .mod。
擁有自己Footprint Library很重要, 因為Footprint 涉及PCB board製造, 對於自己常用的IC用料, 你可以很快且很放心的使用你專屬的footprint,這樣做PCB板的速度才會比別人快。

library就是footprint的集合

簡而言之,footprint 主要的設計就是要知道板框及Pad的尺寸, 如下圖所示,你會一直看到 dimension in inch/mm 之類的字眼。pad包含位置,pitch (pad 間距)及pad排列及編號,以及pad是否有鑽孔, 孔徑大小,鍍銅等規格,所以這要配合IC Databook 來做。從這裡你可以明顯看出來,這是一項工藝技術, 尤其在機構工藝上。



管理footprint library


在kicad 軟體,PCB Module Editor 不僅是用來產生footprint 同時也是拿來管理footprint library用。

可以自新建一個footprint 然後存在目前所選擇的active library裡, 也可以另存一個新的library (.mod) 。也可以取出active library 中的某一個footprint 拿來修改再存回或者重新另存一個新的footprint, 但這個新的footprint 要取別的名字, 因為在同一個Library檔,每一個footprint 都有自己唯一命名。



ARM MCU Board


使用Raspberry Pi 的時候, 是不是常常苦惱於缺乏PWM、ADC及DAC的功能? 
而這都卻是在Arduino上所擁有的基本能力。過去, 為了讓Raspberry Pi 補上這些功能,就會開始用麵包板去插上我們需要的IC或者購買一堆的小的模組板,如PCA9685 for PWM,MCP3008 for ADC 這類的模組板來接在Raspberry Pi 。

要讓 Raspberry Pi  的功能更加完美就要加上更好的左右手,所以我們就開發了這一塊板子。
  
  ARM MCU Board提供40 pin GPIO座,故可以直接在插在Raspberry Pi 上面作為擴充PWM與ADC等等功能的擴充。 ARM MCU Board 已提供好韌體,Raspberry Pi 可以透過UART、I2C、SPI 界面,就可以實現ADC, PWM的功能。同時,這片板子本身是可以stand alone 運作, 因為它本身就具有一顆ARM Cortex-M0 的晶片 (使用的是新唐的Nano130SD2BN) ,你也可以拿 Keil MDK 來撰寫其上的韌體程式。







2015年11月19日 星期四

PCB Layout 入門教學(四) ---以階層式的架構繪製電路圖


以階層式的架構繪製電路圖


若電路圖一張圖紙畫不下,一種方法就是調整Paper大小,如調到A3大小, 把線路全部畫在同一頁。另一種方式是將電路以階層式的架構來畫,從最上層(Root層)一直畫到最內層。每一層就是一個sheet, 把相關的電路都畫在同一張sheet,如此就是一個電路模組化的一個概念。對一個複雜的電路,看整個電路就更有結構性並且具有層次感。

從軟體程式設計角度來看, 一個IC元件就是一個函數。一群IC元件的集合就是一個Library檔案。寫C程式,你可以全部程式碼存在一個.c 檔,也可以按功能分別存在不同的.c檔。雖然功能上也許都對, 但只是結構性好不好的問題而已。畫電路和寫程式的概念一樣, 你可以全部畫在同一張sheet (.sch), 也可以按功能分別畫在不同的sheet。


2015年11月18日 星期三

PCB Layout 入門教學(二) ---建立元件library


建立自己元件library


一個schematics component library (xxx.lib)底下會有很多component (schematics symbol).

 library 包含多個component (schematics symbol).

2015年11月16日 星期一

PCB Layout 入門教學(六) ---產生 Gerber File


PCB Layout 入門教學(六) --- 產生 Gerber File

從 CAD 到 CAM

Gerber File是PCB板廠用來製作一片PCB所需要的檔案, 也就是要給CAM (電腦輔助製造) 要吃的檔案格式。Gerber格式是一種二維向量圖像文件格式。它是印刷線路板行業軟體中用於描述印刷線路板圖像的標準格式。 

要製作一個PCB板, 必須提供板廠Gerber檔案。所謂Gerber檔,其實是包含一群檔案 (如下圖所示),如包含正反面銅箔層 F.Cu B.Cu.,正反面文字面 F.Silkscreen ,B.Silkscreen,防焊層 SolderMask、板邊裁切Edge.Cuts 等。另外,還要給鑽孔Drill (.drl)及 Drill Map (.map) 的Gerber 檔案,此會描述此PCB所用到的鑽孔的孔徑尺寸及鑽孔位置。

  • Cu (銅箔層/線路層)
  • Silk Screen(文字層): 主要的功能是在電路板上標註各零件的名稱、位置框,方便組裝後維修及辨識用。
  • Solder Mask: 防焊層(綠油層) :並非全部的銅面都要吃錫上零件,因此非吃錫的區域,會印一層隔絕銅面吃錫的物質(通常為環氧樹脂),避免非吃錫的線路間短路。根據不同的工藝,分為綠油、紅油、藍油、黑油、白油等顏色
  • Drill Map : 描述 PCB 有鑽孔位置及孔徑。

    2層板的話, 有正面(Front)及背面(Back). 故會有F.Cu或 B.Cu
  • ----------------
  • Paste Mask: 製作鋼板用的圖層。鋼膜上的孔就對應著電路板上的SMD 器件的焊點。(該層的尺寸與實際SMD焊盤的尺寸相同)
  • Edge.Cuts,: PCB板框裁切用的檔案。
  • Dwgs.User : User Drawing 的部份,可以用來描述板框尺寸(用量測工具)或文字說明的地方。或用來描繪Edge.Cuts以外的部份。這一層完全不影響生產。


2015年11月15日 星期日

PCB Layout 入門教學(一) ---PCB Layout 設計流程



先有一些基本PCB概念, 再開始進行軟體上教學。首先要有個觀念, PCB談的是製作工藝, 不是電路設計。所以即使你不太懂什麼叫電路設計,只要確定有一個可正常工作的電路圖 , 基本上也就可以做出一個PCB板。你也可以做出你自己PCB板,只要你掌握了一些的Design Rule。
至於如何確定這是一個可以"工作" 的電路圖? 你可以先用洞洞板手銲驗證一下電路或用麵包板插一插,先確定一下這是可工作的...Layout PCB時, IC零件再選擇SMD的版本)


要完成一個PCB電路板,基本上可分為主要三個階段, 第一個階段電路圖繪製,第二個階段電路佈局, 第三階段為建立BOM表, 然後進行備料及手銲樣品。

若你的PCB 需要layout到4層板以上或者高速,RF, 天線這種高頻的東西, 這已經屬pro專業等級了, 沒有經過專家指導並不容易,再加上你沒有太多量測儀器, 有些也不太可能自己做, 這已經是另一個level了, 建議找具相關設計專長領域的Layout House 代工,因為可能後續還有EMI, FCC,CE, NCC規範要過。


階段1: 電路圖繪製

2015年11月10日 星期二

用 Python 寫程式控制 WiFi 無線遙控車實作


用 Python 寫程式控制 WiFi 無線遙控車實作

根據前幾篇文章的內容,已經可以簡單而初步地實作一台 WiFi 無線遙控車。基本上所有的事情都是在 Raspberry Pi 的系統上實作出來的。

材料

  • motoduino 車子套件(板子需已燒錄 motoduino 的 firmware)
  • ESP8266 模組
  • 9V 方塊電池 x 3
  • Raspberry Pi
  • 區域網路

設置 WiFi 模組

原本的連線方式是用USB線連接motoduino 和 Scratch,所以這邊要使用ESP8266模組把這個連線切換成WiFi連線。因為不想更動到motoduino 裡面的firmware 所以我們要把ESP8266模組變成可以把motoduino 透過UART 的 tx/rx (pin腳1,2)傳出來的封包用WiFi 無線傳輸的方式傳到指定的網站,也就是Raspberry Pi 所架的網站,這邊假設 Raspberry Pi 的 IP 為 192.168.0.1。
要達到這個需求的一個方法就是去把 ESP8266 的 firmware 刷成 nodeMCU 之後再寫入lua script ,使其在開機之後自動連線到指定的AP上,並將 motoduino 的 UART 和 Raspberry Pi 的 UDP socket 連線。簡易的架構圖如下:
-------------------------      ------------       ---------------
Rapsberry Pi UDP Socket | <==>|ESP8266 tx | ----> | rx motoduino|
                        |     |        rx | <---- | tx          |
-------------------------     -------------       ---------------
ESP8266 刷成 nodeMCU 的方式可以參考之前的文章 :
ESP8266 wifi 通訊模組韌體燒錄簡介
ESP8266 NodeMCU 使用 ESPLorer 寫入 Lua Script
ESP8266 NodeMCU 使用 Lua 自動連網
而自動連線的 Lua Script 如下:
print("ESP8266 START")

ssid = "My_AP"
passwd = "12345678"
scratch_ip = "192.168.0.1"
scratch_port = 12345

wifi.setmode(wifi.STATION)
wifi.sta.config(ssid,passwd,1)

tmr.alarm(1,1000, 1, function()
    if wifi.sta.getip()==nil then
        print(" Wait to IP address! for " .. ssid)
    else
        print("New IP address is "..wifi.sta.getip())
        tmr.stop(1)
        sck = net.createConnection(net.UDP)
        sck:on('receive', function(sck,pl) uart.write(0,pl) end)
        uart.on('data',0, function(data) sck:send(data) end,0)
        sck:connect(scratch_port,scratch_ip)
        sck:send("START UART Tunnel\n")
        uart.setup(0,38400,8,0,1,0)
    end
end)

print(wifi.sta.getip())
其中的 ssid = "MyAP" 為要連線的 AP SSID, passwd = "12345678" 為AP密碼。
scratch
ip = "192.168.0.1" 為 Raspberry Pi 的 IP 位址。而 scratch_port 為 Raspberry Pi 的 UDP socket 的 port number 。
所以在 Raspberry Pi 上可以寫一個 Python script 來接收 motoduino 所傳送過來的封包。
#!/usr/bin/env python3
import socket

def s4aDecode(data):
    dev_id = (data[0] & 0b01111000) >> 3
    dev_val = ((data[0] & 0b00000111 ) << 7) | (data[1] & 0b01111111)
    return (dev_id, dev_val)

def handle_data(data):
    i= 0
    length = len(data)
    if(data[i] & 0b10000000):
        pass
    else:
        i+=1
    while(i<length):
        try:
            print(s4aDecode(data[i:i+2]))
            i+=2
        except:
            break

address = ('',12345)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(address)

while(True):
    print('--')
    data, addr = s.recvfrom(1024)
    handle_data(data)
詳細的s4a protocol 格式設定可以看之前寫的文章:
Python 操控 S4A 透過通訊協定來下手
這樣就可以大概了解如何去用Python 來操控 motoduino 的車子了。我們寫了一些簡單的範例碼放在github之上。