顯示具有 arduino 標籤的文章。 顯示所有文章
顯示具有 arduino 標籤的文章。 顯示所有文章

2018年8月7日 星期二

LED 旋轉顯示器

demo 影片

source code: https://github.com/cy-arduino/led_spin_display

載具(開發用):

馬達: 無刷( 2212, 980KV)

電變: 30A

PWM轉速控制: arduino nano


本體

LED:

單色16顆


供電:

電池


傳輸:

無線(BT HS-05, SPP)


轉速偵測:

光遮斷器


開發版:

arduino nano



設定方法: 

透過BT SPP,下command控制LED 顯示內容


範例:

好棒棒.txt 

gogogo.txt

2016年8月8日 星期一

自製四軸直升機飛控板

基本上這個架構是自己陸續看一些東西後整理出來的一個大致的架構
目前input 跟output 部分都有經驗了,會等姿態的部分研究差不多後,就可以全部都整合都起來...




考慮到成本與實際上飛行時的載重,應該會採用這台450來當作載具測試
用普通的2212馬達/電變加上紅白機架兩千塊即可打發,撞壞比較不傷荷包



2016年8月7日 星期日

arduino 解析PPM 訊號


這是在弄X9D+ 搖控器控制jj1000四軸時,因為發現四軸飛在空中時偶爾會抖一下,debug後發現問題的紀錄
http://ddddiy.blogspot.tw/2016/08/x9d-nrf24l01-v2x2-protocoljj1000.html


PPM(Pulse code Modulation mode) 訊號格式可以參考這邊
http://diydrones.com/profiles/blogs/705844:BlogPost:38393

基本上就是把PWM 訊號全部編碼整合在一個pin 上
在遙控模型的領域內,PWM 格式"一般"定義如下

  • 每個clock周期總長20ms
  • 拉high 
    • 1ms: 通道最小值
    • 1.5ms: 通道最小值
    • 2ms: 通到最大值

而PPM 內每個通道用的時間相同,只是改成時間到時瞬間拉一下high(送interrupt)
可參考網路上這張圖
https://www.google.com.tw/search?biw=1280&bih=614&tbm=isch&sa=1&q=PPM+&oq=PPM+&gs_l=img.3..0i19l10.7835.7835.0.8134.1.1.0.0.0.0.54.54.1.1.0....0...1c.1.64.img..0.1.53.DsrA7tEbXa8#imgrc=68KP1G0WoL6ovM%3A

一開始先來個脈波,之後依各通道的值對應的時間到了送出一個脈波,最後low的時間夠長,可以用來判斷一個大週期的結束

舉個例子來說,假設共四通道,各通道的值為

  • CH1: 最小值
  • CH2: 中立點
  • CH3: 中立點
  • CH4: 最大值

實際上送出的訊號如下
|上一個週期| ↑↓(1ms)↑↓(1.5ms)↑↓(1.5ms)↑↓(2ms)↑↓(明顯大於2ms的時間) |下一個週期|
所以只要用中斷抓rising edge並計算間隔後,即可知道各通道對應的值,最後剩下來的時間,長度明顯大於2ms, 當作sync 訊號來判斷此次周期已結束
照這個設計來看,20ms 可放入8通道的訊號(9通道無法分辨sync)




來看一下之前控制jj1000四軸的程式,這個project一開始是clone網路上其他玩家的project
原本的設計有一些問題
https://github.com/goebish/nrf24_multipro/

原本的code做法如下

  • setup
  • loop
    • 確認protocol, 對RF 模組做初始化與對頻
    • 從Servo_data[chan]取出目前各通道的值
  • ISR
    1. 讀出目前timer值<==可得知經過多少us
    2. reset timer
    3. 小於510us 當作雜訊,紀錄長度
    4. 大於1910當作sync
    5. 其他則是將讀出的數據加上雜訊依序填入Servo_data[chan]
這個做法沒有判斷目前PPM 訊號的high/low,每次狀態改變都會觸發中斷,會造成中斷數量增加,且以PPM設計來說拉high時間短,很有可能掉中斷(level trigger的狀況,如果轉換過快,沒有在high or low停留一段時間,比較可能會漏掉),使得干擾等因速會影響到該大週期內,每個channel 的對應
以工作的經驗來說,這類型的訊號適合用edge trigger, 搭配PPM 的設計,使用rising edge trigger較合適
實際遇到問題,通常下一個大週期就會回復正常,但飛行時就會導致四軸在空中會突然抖一下

修正成下面的做法後調整PPM判斷參數與interrupt,中斷數量可以也少一半,且實際飛行也穩定多了
  • initial
    • PPM_IN_MIN=510
    • PPM_IN_MAX=2200
  • setup
    • PPM pin 設為input
    • 註冊ISR(rising)
    • 設定timer1 每1us增加1
  • loop
    • 確認protocol, 對RF 模組做初始化與對頻
    • 從Servo_data[chan]取出目前各通道的值
  • ISR
    1. 讀出目前timer值<==可得知經過多少us
    2. reset timer
    3. 目前timer小於PPM_IN_MIN當作雜訊,紀錄長度
    4. 目前timer大於PPM_IN_MAX當作sync
    5. 其他則是將讀出的數據加上雜訊依序填入Servo_data[chan]

2016年8月6日 星期六

四驅車GP晶片計畫

自從去年發現租屋處附近開了一家四驅車店家之後,就又重新燃燒起熱血
台灣不流行的期間基本上幾乎完全沒有消息,也沒有軌道可玩(日本好一點四驅車一直都存在,但也是沉寂多年官方沒有辦全國性的比賽)

回鍋後發現現在的玩家有很大的比例跟我一樣是二十多到三十多歲的大人,小時候有玩過,長大後又跳進來玩
可能因此導致現在軌道跟十多年前相比比較偏向技術軌,多了很多難度,所以不是單純比高速,而是變成在不飛車的前提下盡快跑完全程

之前看了很多四驅車相關的網站、論壇、玩家的部落格
基本上是都是以田宮 or 半田宮 的規則在玩,使用固定的機制去應付像是跳台或交換到這種難關
例如跳台落地為了穩定度,改成避震車或使用金球、吊鐘,為了過彎加裝單向輪/彈簧前後翼等...
為了因應不同場地而做調整,須累積大量的經驗,熟悉各種零件的特性,以整體賽道所有難關的"最大公約數" 的方向去做調整

在這個過程中,不斷的去發揮創意改裝與測試,真的有很多樂趣,這也是四驅車吸引人的地方

不過玩了一陣子後,就一直在想以這種玩法,就算玩到最極限,也是要配合賽道在各種方面(速度、重量、改裝方式等...)做取捨,所以漸漸地有了一個想法:
何不結合單晶片,讓車子自行適應軌道後做調整,這樣可以使用幾個基本車型(像是輕量高速型或是扭力型)來稱霸所有類型跑道

其實這就是卡通裡的GP 晶片啊!!!
在網路上有看到一些玩家使用單晶片改裝GP晶片,但是偏向語音或人工控制車子
https://www.youtube.com/watch?v=85913C7MjoQ
https://www.youtube.com/watch?v=C1x2Jdm_9eA


而我比較感興趣的部分則是讓車子自行學習,能夠自行適應各種跑到跑出不錯的成績

有了這個想法後,漸漸的想了一些可行的架構與做法,部分的功能也曾經做出可行的成品
(綠色部分是已經有做過有經驗的部分,藍色部分是已有方向正在研究中,紅色部分是還沒有想法或是需要重頭學習的領域)

目前先規劃一下架構,整理一下有能力與需要學習的部分,最後再全部整合起來




arduino 超小型開發板digispark

這個開發板很特別

  • 優點
    • 有USB
  • 缺點
    • IO太少
    • 效能差
    • 需使用專用的IDE


建立開發環境與連接

基礎

專用版arduino


無法燒錄問題arduino-1.6.8
未知的板子digispark-tiny(平台avr,套件digistump

Error compiling for board Digispark (Default - 16.5mhz).
方法:
  • Uninstall through boards manager
  • Exit Arduino
  • Remove contents of .arduino15/staging/packages (I had a CRC doesn't match error) 
    • ==>位置在C:\Users\CY\AppData\Local\Arduino15
  • Remove .arduino15/packages/digistump
  • Reinstall boards through boards manager
  • Restart Arduino


我用的是這種,是model A(LEDpin1)







燒錄方法:
  1. 板子選digispark default 16.5mhz
  2. 燒錄器不須設定(不會看)
  1. 移除板子usb
  1. IDE 按上傳

  1. 插上板子usb


有library可軟體模擬成USB裝置
DigiCDC - Digispark USB CDC Serial Library

來自 <https://digistump.com/wiki/digispark/tutorials/digicdc

2016年8月5日 星期五

使用Arduino 搭配光電晶體(非光敏電阻)來偵測螢幕高速閃動


這是當初為了工作,偵測螢幕閃動頻率所做的小玩具
使用光電晶體是因為影片通常為30 or 60 fps, 33ms的速度對光敏電阻來說反應太慢

兜起來後發現如果解析度要高,需使用極大的電組(100M歐姆以上),
到電子材料行找了好久才找到一些10M歐姆的來串聯





2016年8月3日 星期三

X9D+ 使用NRF24L01 (v2x2 protocol)控制jj1000





整體架構大致如下,架構還蠻簡單的

  1. X9D+ 遙控器輸出電源與PPM訊號
  2. Arduino 
    1. 負責選擇protocol
    2. 控制NRF24L01對頻
    3. 收PPM訊號,解析出來
      1. http://ddddiy.blogspot.tw/2016/08/arduino-ppm.html
    4. 透過NRF24L01傳送各通道訊號



目前可以動了,但有幾個問題
  1. jj1000 led 燈幾秒會閃一下
  2. 不動時,有時油門會突然稍微轉一下
    1. 目前懷疑控輸出的PPM 有問題,導致arduino 計算錯誤
  3. 上面兩個問題可以調整timing解決
    1. http://ddddiy.blogspot.tw/2016/08/arduino-ppm.html


jj1000 對頻方法
  1. jj1000 開機
  2. 遙控端切換protocol(PROTO_V2X2, 值為0, 我修改的code 可以印出debug message)
    1. 按著前傾
    2. ch12最大




X9D
Leonardo
NRF24L01
PPM(pin1)
pin2

Vout(battery voltage, pin3)
Vin

GND(pin4)
GND
GND

SPI-MISO(pin14)
MISO

SPI-MOSI(pin15)
MOSI

SPI-SCK(pin16)
SCK

pin9
CE

pin10
CS

3.3V
VCC




DBG(pin6 to 5V or 0V)









我的code(porting to Arduino Leonardo)
Use D:\work\arduino\arduino-1.6.8

porting to arduino leonardo
1. change pin define
2. add debug function and dynamic debug message
- set DBG_ON=1 in source code
- connect DBG_pin(enable debug) to VCC or GND(disable debug)
3. abstract PPM_INPUT_MIN/MAX
4. fix bu
g about PPM ISR setup
- use digitalPinToInterrupt(PPM_pin)
5. increase throttle safe check delay to 1s

來自 <https://github.com/cy-arduino/nrf24_multipro/commit/8c776f6ef0f2fd794154fa3c51ff08ce60b72803>


原始github source









nrf24l01 pin define








除了AETR前四個通道,其餘通道功能如下(依協定不同有些微差異)
Channel 5: led light, 3 pos. rate on CX-10, H7, inverted flight on H101
Channel 6: flip control
Channel 7: still camera
Channel 8: video camera
Channel 9: headless
Channel 10: calibrate Y (V2x2), pitch trim (H7), RTH (H8 mini/H20), 360deg flip mode (H8 mini 3D/H22)
Channel 11: calibrate X (V2x2), roll trim (H7)

Channel 12: Reset / Rebind













reference:
    遙控器輸出PPM格式 http://www.geek-workshop.com/thread-2408-1-1.html

2014年9月25日 星期四

超扯的Dswy_Robot Arduino Pro Mini

買來弄了好幾天都無法燒錄,上網爬文才發現原來硬體本身就有問題!!

有強者研究過電路發現線路跟打件都有問題
http://forum.arduino.cc/index.php?PHPSESSID=rkapppp0l0t1qhdt3keg6pqqi6&topic=217246.msg1763384#msg1763384


須手動rework
1. C1與C4這兩顆電容打錯件,須交換
2. C2與C1須斷開,并將C2斷開的地方拉到reset




第一張版子由於已經焊了許多pin腳,所以只能土法煉鋼解焊下來交換後焊回去
第二章直接使用已前在網路上看到的焊接小技巧,將版子放在烙鐵上面(版子要放平,避免錫融化後元件都跑掉),加熱到錫融化後,直接使用小夾子交換兩個零件




2014年9月24日 星期三

使用Arduino Leonardo燒錄Arduino pro mini

  1. 將Leonardo當作ISP
    1. 開啟arduino IDE內的範例: "Arduino ISP"
    2. 修改內容,將define 的 RESET 改成10,LED_HB改成13(呼吸燈,用來確認ISP是否正常運作)
    3. 另存成"Arduino ISP Leonardo"
    4. 上傳到Leonardo 版子上面
      1. "工具->版子"選"Arduino Leonardo"
      2. "工具->燒錄器"選"USBtinyISP"
  2. 設定arduino IDE
    1. 修改arduino-1.0.5-r2\hardware\arduino\programmers.txt,加入這幾行:
      1. arduinoisp.name=Leonardo as ISP 
      2. arduinoisp.communication=serial 
      3. arduinoisp.protocol=arduino
      4. arduinoisp.speed=19200
  3. 連接Arduino Leonardo與Arduino pro mini
  4. 燒錄bootloader<==新的版子可能沒有內建bootloader,燒過一次就不用再燒了
    1. "工具->版子"選"Arduino Pro or Pro mini(5v, 16Mhz) W/Atmega328"
    2. "工具->燒錄器"選"Leonardo as ISP"
    3. "工具->燒錄bootloader"
  5. 燒錄sketch
    1. "工具->版子"選"Arduino Pro or Pro mini(5v, 16Mhz) W/Atmega328"
    2. "工具->燒錄器"選"Leonardo as ISP"
    3. 可以直接燒範例內的Blink,用pro mini 內建的 LED來看是否有燒成功

連接方法:
"leonardo"  "pro mini"
MISO          MISO
MOSI          MOSI
SCK            SCK
VCC            VCC
GND            GND
pin 10          RESET


注意: MISO/MOSI/SCK在leonardo右邊有一個ICSP接頭(6pin)上

排列:
1 2
3 4 
5 6

1. MISO
2. VDD
3. SCK
4. MOSI
5. RESET
6. GND



2014年4月8日 星期二

GY-273 使用HMC5883晶片的三軸電子羅盤 e-compass

data sheet
http://www.seeedstudio.com/wiki/images/4/42/HMC5883.pdf

***注意*** module上面標示的Y軸與Z軸是顛倒的!!
  1. I2C addr為 7bit 0x1E,最後一個bit為控制i2c read/write
    1. master read: 0x3D
    2. master write: 0x3C
  2. 有兩種控制模式:
    1. 連續讀取
    2. 單次讀取
  3. 參考data sheet內有範例:


每次讀取間隔約需要6.26ms


所有register列表:

  • 設定:
    • Configuration register A/B
    • Mode register
  • 讀取資料
    • Date output X MSB/LSB register
    • Date output Y MSB/LSB register
    • Date output Z MSB/LSB register
  • CHIP狀態
    • Status register
  • 辨認chip
    • Identification register




register細節












2014年3月20日 星期四

Arduino 小技巧 - 修改servo library, 使其更新動作速度更快


http://www.diy-robots.com/?p=1183

一般servo控制,都是20ms更新一次,每次拉高一段時間,拉高的時間範圍約為1000-2000us, 
1500us為中間點

可以修改Arduino servo library,使更新間隔降到2500us(2.5ms),對於需要快速控制的用途很有幫助

libraries\Servo\Servo.h
//#define REFRESH_INTERVAL    20000     // minumim time to refresh servos in microseconds 
#define REFRESH_INTERVAL 2500

2014年3月19日 星期三

Arduino 小技巧 - 使用GPIO當作5V or GND的方法

有時候測試時沒有使用麵包版,
版子上又有多餘的GPIO時,若電流很小(例如驅動一般LED),可以使用GPIO當作VCC/GND

以Leonardo為例,GPIO可以輸出40mA
http://arduino.cc/en/Main/ArduinoBoardLeonardo#.Uym72PmSyXo

Summary

MicrocontrollerATmega32u4
Operating Voltage5V
Input Voltage (recommended)7-12V
Input Voltage (limits)6-20V
Digital I/O Pins20
PWM Channels7
Analog Input Channels12
DC Current per I/O Pin40 mA
DC Current for 3.3V Pin50 mA
Flash Memory32 KB (ATmega32u4) of which 4 KB used by bootloader
SRAM2.5 KB (ATmega32u4)
EEPROM1 KB (ATmega32u4)
Clock Speed16 MHz


ex:
  pin8: 5V
  pin9: 0V

code:
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  digitalWrite(8, HIGH);
  digitalWrite(9, LOW);


2014年3月10日 星期一

Arduino藍芽遙控小車

使用Arduino搭配兩個模組

  1. MTADRL293D 馬達控制板
    1. http://ddddiy.blogspot.tw/2014/02/mtadrl293d.html
  2. HC-05 藍芽模組
    1. http://ddddiy.blogspot.tw/2014/02/hc-05-bt-module.html

做法:
  1. 參考這裡將HC-05 藍芽模組設定好,接上VCC/GND,並將HC-05的TX/RX接到Leonardo的RX/TX
  2. 將MTADRL293D插上Leonardo
  3. 將MTADRL293D的M1/M4(在這張版子上這兩顆馬達吃BATT的電,另外兩顆吃5V)接到車子左右兩顆馬達的正負極
  4. MTADRL293D接上電池

車身/履帶/減速機: 田宮 工作樂系列

範例程式碼:

2014年3月3日 星期一

Arduino小技巧 - Library寫法

觀察一下原本內建的library,可以發現Arduino的library寫法非常簡單

以我自己所寫的74HCT595N library為例:

  1. 撰寫 xxx.h
    • class定義, 常數...
  2. 撰寫 xxx.cpp
    • 實做class 
  3. 新增 keywords.txt
    • Datatypes (KEYWORD1)
    • Methods and Functions (KEYWORD2)
    • Constants (LITERAL1)
  4. 將三個檔案放入一個資料夾xxx後,丟到
    • arduino-1.0.5-r2\libraries
  5. 可以順便寫個範例程式,放入examples資料夾,丟到
    • arduino-1.0.5-r2\libraries\xxx


範例:



發現官方說明文件:
http://arduino.cc/en/Guide/Libraries#.Uxxb7vm1bNk

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

目前發現,無法從一個Library A去使用另一個Library B

  • 編譯時會提示找不到B.h
    • 將#include "B.h" 改成#include "../B/B.h"後,可以找到.h 檔,但仍找不到實作的部分
目前暫時的解決方法是把B.h/B.cpp複製到A的資料夾內

2014年2月26日 星期三

74HCT595N工作原理

這是一顆計數暫存晶片

可以使用序列的方式傳入Q0~Q7的狀態(high or low)到內部register,然後輸出時chip依照register值去拉Q0~Q7的狀態

可以使用少數腳位一次控制Q0~Q7的狀態,此外由於此chip可以串接,所以可以一次控制更多腳位


下列圖來源: http://arduino.cc/en/uploads/Tutorial/595datasheet.pdf



74HCT595N腳位:

  • VCC:5V
  • GND
  • Ds: serial data in
  • Q0~Q7: 8根輸出pin
  • Q7': storage register對應到Q7的bit,最為多顆chip 串接用
  • MR: (active low) 清空shift register
  • OE: (active low) 
    • OE拉low,STcp raising時,將storage輸出至Q0~Q7 
    • OE拉high,Q0~Q7輸出為高阻抗(相當於沒接上這顆chip)
  • SHcp: raising edge trigger, 觸發shift register shift 1 bit(新的1bit資料由Ds取)
  • STcp: raising edge trigger


從文件可以知道,74HCT595N有兩個register(8bit):
  1. shift register - 序列資料輸入時使用
  2. storage register - 控制Q0~Q7輸出時為high or low

從文件可以知道,SHcp/STcp最高可運作在100Mhz(每個clock 10ns)

  • 由此可得知下面範例SHcp/STcp拉high/low時,每次delay只要5ns,不過由於Arduino delay最小只能用1 micro second,所以設定delayMicroseconds(1)即可


基本原理
  1. 透過序列的方式將資料傳入shift register
  2. 將shift register資料傳入storage register
    1. 每個SHcp raising edge,資料會一直輸入進去chip的shift register
      1. Q0'~Q7'代表shift register的值
      2. Serial date寫入方向:
        1. Ds > Q0' > Q1' > Q2' > Q3' > Q4' > Q5' > Q6' > Q7'
  3. 輸出到Q0~Q7
範例:
  1. 連接
    1. chip 接上VCC/GND
    2. micro controller gpio 接上Ds/MR/OE/SHcp/STcp
  2. 初始化:
    1. Ds/MR/OE/SHcp/STcp全部拉low
      1. 此時由於MR為low,shift register全部清為0
    2. STcp LOW->HIGH->LOW,將shift register的值寫入storage register
      1. 此時由於OE為LOW,storage register的值馬上會輸出至Q0~Q7
  3. 資料寫至shift register
    1. MR 拉HIGH
    2. 將Q7的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    3. 將Q6的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    4. 將Q5的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    5. 將Q4的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    6. 將Q3的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    7. 將Q2的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    8. 將Q1的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
    9. 將Q0的值設到Ds, SHcp LOW->HIGN->LOW將資料移入shift register
  4. 將資料從shift register移到storage register
    1. STcp LOW->HIGH->LOW
      1. 此時由於OE為LOW,storage register的值馬上會輸出至Q0~Q7


實做:

  • 使用MTADRL293D 電機驅動模組,其中
    • Ds: Arduino pin 8
    • MR: 固定拉high
    • OE: Arduino pin 7
    • SHcp: Arduino pin 4
    • STcp: Arduino pin 12

Arduino可使用我寫的library操作74HCT595N:



簡單控制74HCT595N的範例程式碼:
const int DS = 8;
const int OE = 7;
const int SHCP = 4;
const int STCP = 12;

void setup(){
  Serial.begin(115200);

  while (!Serial){
    ;
  }

  delay(1000);
  Serial.println("=== setup() ===");

  pinMode(DS, OUTPUT);
  pinMode(OE, OUTPUT);
  pinMode(SHCP, OUTPUT);
  pinMode(STCP, OUTPUT);

  digitalWrite(DS, LOW);
  digitalWrite(OE, HIGH); //Q0~Q7 維持高阻抗
  digitalWrite(SHCP, LOW);
  digitalWrite(STCP, LOW);
}

void loop(){
  Serial.println("=== loop() ===");
  delay(1000);

  //serial data input into serial register
  //Q0~Q7: 00001111
  Serial.println("##serial data input into serial register");
  digitalWrite(DS, HIGH);//Q7
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, HIGH);//Q6
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, HIGH);//Q5
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, HIGH);//Q4
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, LOW);//Q3
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, LOW);//Q2
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, LOW);//Q1
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);
  digitalWrite(DS, LOW);//Q0
  digitalWrite(SHCP, HIGH);
  delayMicroseconds(1);
  digitalWrite(SHCP, LOW);
  delayMicroseconds(1);

  delay(1000);

  //serial register -> storage register
  Serial.println("##serial register -> storage register");
  digitalWrite(STCP, HIGH);
  delay(10);
  digitalWrite(STCP, LOW);
  delay(10);

  delay(1000);

  //storage register -> Q0~Q7
  Serial.println("##storage register -> Q0~Q7");
  digitalWrite(OE, LOW);

  delay(1000);

  Serial.println("##finish");
  while(true){
    ;
  }
}






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


相關連結




待續