Your SlideShare is downloading. ×
Aldebaran
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

Aldebaran

1,737
views

Published on

自作LEDペンライトを創ったお話です。 …

自作LEDペンライトを創ったお話です。
2013年01月19日開催「高専カンファレンスin沼津2」で発表に使用しました。

Published in: Education

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,737
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
1
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Aldebaran鈴鹿高専 電気電子工学科OB http://山城淑敬.jp/
  • 2. 自己紹介 ◎えれくとりっく(自称)なエンジニア◎ 学生時代は「高専ロボコン」に参加 ’10/12:021numazuで 高専カンファレンスデビュー ’11/04:製造業(技術職)に就職 ’12/06:エンベデッドシステムスペシャリスト取得! ‘13/01:066numazu2で再び沼津に! ※詳細はfacebook参照。
  • 3. はじめに Aldebaranとは何ぞや? →自作LEDペンライトの開発コードネーム 開発の動機は?
  • 4. 初めてのライヴ どうやら光る棒を振るのが流儀らしい。 →サイリウムは再利用出来ないので・・・ 大須の「でらなんなん」でLEDフルカラー ペンライトを調達!
  • 5. ないんだったら自分で作ればいいのよ! 最適な電源とは? 最適なLED点灯制御とは? CRローパスフィルタによる簡易DAC トランジスタによるカレントミラ回路 アッセンブラによる低級プログラミング 導光棒テクノロジ搭載 そして魔改造へ・・・
  • 6. できたっ! 簡易DAC カレントミ ラ 昇圧回路
  • 7. 最適な電源とは? 市販のLEDペンライトは? ・ボタン電池×3個 or 単4電池×3個 どうして? ・LEDの色は「電圧降下量」で決まる。 →ボーアの周波数条件 ・電圧降下量は「材料」で決まる。 赤色LEDは約3Vの電圧降下が必要。 →電池一本は1.5V×3本=4.5V
  • 8. 最適な電源とは? 単4充電池一本で解決したい! →昇圧回路で全て解決!!
  • 9. 最適なLED点灯制御とは? 簡単な方法は「PWM」制御。 →超高速にLEDをON←→OFFさせる事で、 擬似的に明るさを調整する。 →電池消耗や、LED劣化により安定しない。 最適な方法は「電流」制御。 →LEDの明るさは「再結合量」で決まる。 →フルカラーLEDの色は 「各色の明るさ」で決まる。
  • 10. CRローパスフィルタでDA変換 CRローパスフィルタにPWM波形を入れると簡易的にDA変換が実施出来ます。 →PWMデューティ比に応じた電圧が出る。
  • 11. カレントミラ回路 カレントミラ回路とは? →下図で左右のトランジスタのコレクタ電流が等しくなる。
  • 12. カレントミラ回路 抵抗を入れると? →抵抗比で右側の電流量を左側のX倍に決められる。 右図の場合は、 1kΩ÷47Ω=21倍 の電流が流れる。
  • 13. 組み合わせると? PWMデューティ比で電圧が決まる。 電圧で左側Trに流れる電流が決まる。 右側Trは左側Trの21倍の電流が流れる。
  • 14. 確認する PWMのデューティ比を変えると明るさが変 わった! 本当に電流制御になってる? →LEDの波形が変動していないのでOK! PIC出力→ LED電圧→
  • 15. アッセンブラでプログラミング なぜアッセンブラ? →PIC12F675マイコンにはPWMは1系統のみ →フルカラーLED制御には3系統が必要 →プログラムで擬似的にPWM生成が必要 →PICの処理能力が低いため、 C言語だと周波数が下がる。 →C言語だと波形が正確に生成できない →なぜ? ※タイマ割込では動作が遅い。
  • 16. CじゃダメだASMだ! C言語の場合、1命令にかかる時間が不明。if (count_red == 0){ port_red = 0;}count--; →条件成立時と不成立時で 実行時間にムラが出る。 →明るさ調整(色)に影響が出る!!!
  • 17. CじゃダメだASMだ! MAIN_OUTPUT_LP_GREEN ASMにはif文も存在し MOVF DUTY_GREEN_TMP,W BTFSC STATUS,Z ないため、CALLや GOTO MAIN_OUTPUT_LP_GREEN_END DECFSZ DUTY_GREEN_TMP,F GOTOを上手く活用して GOTO MAIN_OUTPUT_LP_GREEN_ON GOTO MAIN_OUTPUT_LP_GREEN_OFF プログラムを作成しま MAIN_OUTPUT_LP_GREEN_ON BSF OUTPUT_TMP,LED_GREEN NOP す。 NOP GOTO MAIN_OUTPUT_LP_BLUE MAIN_OUTPUT_LP_GREEN_OFF どの分岐でも等しい実 BCF OUTPUT_TMP,LED_GREEN GOTO MAIN_OUTPUT_LP_BLUE 行時間かつ最速で処理 MAIN_OUTPUT_LP_GREEN_END NOP NOP します。 NOP NOP 全368行、7,241文字。 NOP NOP GOTO MAIN_OUTPUT_LP_BLUE
  • 18. 光導棒テクノロジ 輝度ムラ(LEDに近い根元が明るく、先端が暗い)を解消するためには?→光ファイバで先端まで光を運べば良い。
  • 19. 完成っ! パターン設計は、ちょっぴりの知識と ひたすらに根気のいる作業です。
  • 20. 完成っ! (サイリウムと比較)
  • 21. 魔改造♪ 昇圧後の電圧は5V。 →USB LEDペンライト化 モバイルブースタと合わ せると無限LEDペンライ トに!
  • 22. Let’s Enjoy! 電子工作ってすっっっっごく楽しい! 最近は電子工作ブーム?らしく、Arduino をはじめとした入門者向けキットや書籍 も豊富!∴みんなも電子工作しよっ! ありがとうございました!
  • 23. One More Things…
  • 24. NEW NEXTBetelgeuse NIPPON NANAIRO
  • 25. ’13/夏 AldebaranはBetelgeuseへ! Aldebaranの設計思想を踏襲! →単4電池一本で駆動 →電流制御で彩り鮮やか! より高度な制御プログラムを搭載! あなただけのLEDペンライトが作れる! 外形パイプをアクリルから ポリカーボネイトに材質変更&薄肉化! →ポリカはアクリルの26倍もの衝撃強度!
  • 26. Betelgeuse 今夏公開 日本に新しい七色を。NEW NEXT NIPPON NANAIRO
  • 27. ありがとうございました
  • 28. 質問タイム
  • 29. ;------------------------------------; ●Aldebaranプログラム; 更新日時:2012.12.26; 作成日時:2012.12.12; Ver.0.1 ●更新履歴; Ver.1.0 Y.Yamashiro Y.Yamashiro; Ver.1.5; Ver.C83; 2012.12.12 2012.12.24 2012.12.25 Y.Yamashiro INCLUDE,__CONFIGを作成 Y.Yamashiro 点灯確認、EEPROM記憶化確認 Y.Yamashiro ソースコードを整形;; 2012.12.26 Y.Yamashiro 初出;------------------------------------ LIST P=PIC12F675 INCLUDE _CP_OFF & _CPD_OFF & _BODEN_ON & _MCLRE_ON & _WDT_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT "P12F675.INC";------------------------------------ __CONFIG CBLOCK 0x20TIMER_TMPCOLD_START_TMPDUTY_RED ; コールドスタート時ウェイト用カウンタ ; タイマ用カウンタ ; 赤色のデューティDUTY_GREENDUTY_BLUEDUTY_TMP ; 緑色のデューティ ; 青色のデューティ ; 3パラレルPWM周期生成用DUTY_RED_TMPDUTY_GREEN_TMPDUTY_BLUE_TMP ; ; ; プッシュスイッチ入力リングバッファOUTPUT_TMPCHECK_PSW_PASTCURRENT_PRESET ; 現在のプリセットNo. ; プリセットNo.->アドレス変換用 ;TOTAL_PRESETSET_COLOR_TMPWRITE_EEPROM_DATA ; 総プリセット数 ; EEPROM書き込み用 ; Aldebaran設定ALDEBARAN_SETTING ; ENDCLED_REDLED_GREENLED_BLUE EQU EQU EQU GPIO2 GPIO0 GPIO1PUSH_SWMASTER_DUTY EQU EQU D19 GPIO4;------------------------------------ ;;EEPROM DATA ORG 02100H プリセット記述(4bytesで一組,R,G,B,X) ; 各色0〜20で設定可能。 DE D20,D00,D00,D00 ; 赤 DE D15,D06,D08,D00 ; 桃 DE D20,D09,D00,D00 ; 橙 DE D20,D16,D00,D00 ; 黄 DE D00,D20,D00,D00 ; 緑 DE D00,D00,D20,D00 ; 青 DE D10,D00,D10,D00 ; 紫 DE D15,D15,D08,D00 ; 白 ORG 0217DH DE B000000017E:最終プリセットNo. DE D00 ; ; ; 7D:アルデバラン設定 DE D07 7F:総プリセット数(0to30);------------------------------------ ORG NOP 0 CLRWDT GOTO NOP INITIALIZE NOP NOP NOP;------------------------------------ NOP GOTO INTERRUPT; 割り込み発生時=異常事態と判断。INTERRUPT BANKSEL GPIOINTERRUPT_LP CLRF ; 無限ループ→WDTリセット。 GPIO;------------------------------------; 初期設定 GOTO INTERRUPT_LPINITIALIZE; 電圧安定用のウェイト(約250ms)を入れる CALL COLD_START; プリスケーラはWDT用(1:128); 内蔵プルアップ(GPIO)を有効 BANKSEL OPTION_REG; 内蔵プルアップ(4,5)を有効 MOVLW MOVWF B00101111 OPTION_REG BANKSEL MOVLW MOVWF WPU B00110000 WPU; 内蔵コンパレータをOFF BANKSEL MOVLW CMCON B00000111; 全てをデジタル入出力にする MOVWF BANKSEL CMCON ANSEL; 入出力設定 CLRF BANKSEL ANSEL TRISIO; ポートの状態を初期値に MOVLW MOVWF B00111000 TRISIO; 変数初期化 BANKSEL CLRF GPIO GPIO;;; CLRF CLRF CLRF DUTY_RED DUTY_GREEN DUTY_BLUE;; CLRF CLRF MOVLW CURRENT_PRESET FLAG_SAVE_LAST_PRESET 0xFF; 設定読み出し MOVWF CALL CHECK_PSW_PAST LOAD_SETTING; 設定終了 CALL GOTO SET_COLOR MAIN;------------------------------------; メイン処理MAIN CLRWDT BANKSEL CALL GPIO CHECK_PSW;------------------------------------ CALL GOTO MAIN_OUTPUT MAIN; 設定読み出しLOAD_SETTING BANKSEL GPIO MOVLW CALL MOVWF 0x7D READ_EEPROM ALDEBARAN_SETTING BTFSS GOTO GOTO ALDEBARAN_SETTING,0 LOAD_SETTING_PRESET_NOSAVE LOAD_SETTING_PRESET_SAVELOAD_SETTING_PRESET_NOSAVE CLRF GOTO CURRENT_PRESET LOAD_SETTING_PRESET_TOTALLOAD_SETTING_PRESET_SAVE MOVLW CALL 0x7E READ_EEPROMLOAD_SETTING_PRESET_TOTAL MOVF GOTO CURRENT_PRESET,W LOAD_SETTING_PRESET_TOTAL MOVLW CALL MOVWF 0x7F READ_EEPROM TOTAL_PRESET;------------------------------------; 色を設定 RETURNSET_COLOR BANKSEL MOVF GPIO CURRENT_PRESET,W MOVWF RLF RLF SET_COLOR_TMP SET_COLOR_TMP,F SET_COLOR_TMP,WSET_COLOR_READ_RED ANDLW MOVWF B01111100 SET_COLOR_TMP MOVF ADDLW CALL SET_COLOR_TMP,W B00000000 READ_EEPROMSET_COLOR_READ_GREEN MOVWF MOVF DUTY_RED SET_COLOR_TMP,W ADDLW CALL MOVWF B00000001 READ_EEPROM DUTY_GREENSET_COLOR_READ_BLUE MOVF ADDLW SET_COLOR_TMP,W B00000010 CALL MOVWF READ_EEPROM DUTY_BLUE; 将来の拡張用;;SET_COLOR_READ_KAKUCHO; MOVF ADDLW SET_COLOR_TMP,W B00000011;; CALL MOVWF RETURN READ_EEPROM DUTY_BLUE;------------------------------------; EEPROM読み込みREAD_EEPROM BANKSEL MOVWF BSF EEADR EEADR EECON1,RD MOVF BANKSEL RETURN EEDATA,W GPIO;------------------------------------; EEPROM書き込みWRITE_EEPROM BANKSEL CLRF BANKSEL GPIO GPIO EEADR MOVWF MOVF MOVWF EEADR WRITE_EEPROM_DATA,W EEDATAWRITE_EEPROM_GO BSF BCF EECON1,WREN INTCON,GIE MOVLW MOVWF MOVLW 0x55 EECON2 0xAAWRITE_EEPROM_LP MOVWF BSF EECON2 EECON1,WR BTFSC GOTO BANKSEL EECON1,WR WRITE_EEPROM_LP GPIO;------------------------------------; プッシュスイッチが押されているか? RETURNCHECK_PSWCHECK_PSW_LOTATE BANKSEL GPIO RLF BTFSC BSF GPIO,PUSH_SW CHECK_PSW_PAST,F CHECK_PSW_PAST,0CHECK_PSW_JUDGE BTFSS BCF GPIO,PUSH_SW CHECK_PSW_PAST,0 MOVF XORLW BTFSC CHECK_PSW_PAST,W B00000011 STATUS,ZCHECK_PSW_YES GOTO RETURN CHECK_PSW_YES INCF MOVF SUBWF CURRENT_PRESET,F CURRENT_PRESET,W TOTAL_PRESET,W BTFSS CLRF CALL STATUS,C CURRENT_PRESET SET_COLOR; 最後に使ったプリセットを保存しておくか? BTFSS RETURN ALDEBARAN_SETTING,0 MOVF MOVWF MOVLW CURRENT_PRESET,W WRITE_EEPROM_DATA 0x7E;------------------------------------ CALL RETURN WRITE_EEPROM; LEDを点灯させる処理MAIN_OUTPUT BANKSEL GPIO MOVLW MOVWF MOVF MASTER_DUTY DUTY_TMP DUTY_RED,W MOVWF MOVF MOVWF DUTY_RED_TMP DUTY_GREEN,W DUTY_GREEN_TMP;-------------------- MOVF MOVWF DUTY_BLUE,W DUTY_BLUE_TMP; ループMAIN_OUTPUT_LP CLRF OUTPUT_TMP このソースコードに限り;----------; 赤色を出力MAIN_OUTPUT_LP_RED MOVF BTFSC GOTO DUTY_RED_TMP,W STATUS,Z MAIN_OUTPUT_LP_RED_END DECFSZ GOTO GOTO DUTY_RED_TMP,F MAIN_OUTPUT_LP_RED_ON MAIN_OUTPUT_LP_RED_OFFMAIN_OUTPUT_LP_RED_ON BSF NOP OUTPUT_TMP,LED_REDMAIN_OUTPUT_LP_RED_OFF NOP GOTO MAIN_OUTPUT_LP_GREEN クリエイティブ・コモンズMAIN_OUTPUT_LP_RED_END BCF GOTO MAIN_OUTPUT_LP_GREEN OUTPUT_TMP,LED_RED NOP NOP NOP NOP NOP NOP;----------; 緑色を出力 GOTO MAIN_OUTPUT_LP_GREENMAIN_OUTPUT_LP_GREEN MOVF BTFSC DUTY_GREEN_TMP,W STATUS,Z 表示2.1日本 ライセンス GOTO DECFSZ GOTO MAIN_OUTPUT_LP_GREEN_END DUTY_GREEN_TMP,F MAIN_OUTPUT_LP_GREEN_ONMAIN_OUTPUT_LP_GREEN_ON GOTO BSF MAIN_OUTPUT_LP_GREEN_OFF OUTPUT_TMP,LED_GREEN NOP NOP GOTO MAIN_OUTPUT_LP_BLUEMAIN_OUTPUT_LP_GREEN_OFF BCF GOTO MAIN_OUTPUT_LP_BLUE OUTPUT_TMP,LED_GREENMAIN_OUTPUT_LP_GREEN_END NOP NOP の下に提供致します。 NOP NOP NOP;---------- NOP GOTO MAIN_OUTPUT_LP_BLUE; 青色を出力MAIN_OUTPUT_LP_BLUE MOVF DUTY_BLUE_TMP,W BTFSC GOTO DECFSZ STATUS,Z MAIN_OUTPUT_LP_BLUE_END DUTY_BLUE_TMP,FMAIN_OUTPUT_LP_BLUE_ON GOTO GOTO MAIN_OUTPUT_LP_BLUE_ON MAIN_OUTPUT_LP_BLUE_OFF BSF NOP NOP OUTPUT_TMP,LED_BLUEMAIN_OUTPUT_LP_BLUE_OFF GOTO BCF MAIN_OUTPUT_LP_DEAD OUTPUT_TMP,LED_BLUEMAIN_OUTPUT_LP_BLUE_END GOTO NOP MAIN_OUTPUT_LP_DEAD NOP NOP NOP NOP NOP GOTO MAIN_OUTPUT_LP_DEADMAIN_OUTPUT_LP_DEAD MOVF MOVWF OUTPUT_TMP,W GPIO DECFSZ GOTO RETURN DUTY_TMP,F MAIN_OUTPUT_LP;------------------------------------; 簡易タイマーTIMER BANKSEL MOVWF MOVF GPIO TIMER_TMP TIMER_TMP,WTIMER_LP BTFSC RETURN STATUS,Z NOP DECFSZ GOTO TIMER_TMP,F TIMER_LP;------------------------------------; コールドスタート時に電圧安定まで待つ RETURNCOLD_START BANKSEL MOVLW GPIO 0xFFCOLD_START_LP MOVWF MOVLW COLD_START_TMP 0xFF CALL DECFSZ GOTO TIMER COLD_START_TMP,F COLD_START_LP;------------------------------------ RETURN END