あむちょです。
初めてのプログラミングはPICでアセンブリでした。
その後、大学でC言語を学び、研究室で制御っぽい事してました。
そして現在、なんやかんやで気づいたらアプリの会社(あまり作ってない)やることになってました。
アプリやパソコン上で動くプログラムばかり作っていると、無性にLEDをチカチカさせたくなるので、はやりのArduinoに手をだすことに。
今回やったこと
そもそもArduinoとは、いわゆるマイコンボードです。以前紹介したWebリモコンのIrkitもArduinoの派生で作られてます。
Raspberry Piがパソコンよりなのにたいし、Arduinoは組み込みよりなきがします。
下がArduinoで、Raspberry Piより一回り小さいぐらい。
今回使ったのは、スタンダードなArduino UNOです。スペックはクロック16MHz、デジタルI/O20本、アナログ入力6本とマイコンとしてはぼちぼち使えます。
開発環境の構築
まずは統合開発環境(IDE)のダウンロード。
本家サイトのダウンロードボタンから該当するOSをクリック。Arduino公式サイト
その後ソフトを起動。
すごくシンプルです。
チェックマークアイコンでコンパイル、→アイコンでArduinoに書き込みです。
ArduinoをUSBでつなぎ、メニューバーのツール→ポートから/dev/cu.usbmodem~を選択
これだけですぐにでも動かせます。
PICみたいにICをライターに差し替える手間もありません。
LEDをPWM制御でふんわりチカチカ
マイコンのHello WorldはLチカ(LEDをチカチカ光らせる)。
LEDのような明るさと電圧が比例しないような時は、明るさを調整するためにPWM制御をします。
PWM制御とはOnとOffを体感できない速さで繰り返し、OnとOffの時間比率を変える制御です。
時間比率を連続的にかえたのがこちら
実際のソースがこちら
<br /> void setup() {<br /> }<br /> void loop() {<br /> static float time = 0;</p> <p> time += 0.02;<br /> if(time > 360)time=0;<br /> int val =( sin(radians(time)) +1 )*255/2;<br /> analogWrite(9,val);<br /> }<br />
標準で使えるPWMポートの9ピン(ほかにも3,5,6,10,11ピンが使える)にLEDをつなげば
analogWrite(9,0~255/*比率*/);
でPWMできます。第2引数は0~255の範囲です。
sinは-1~1の間で連続的な値をとるので、1足して255/2をかければ、0~255の間の値が得られます。
ちなみにPICで同じ事をしたのがこちら
<br /> LIST P=PIC12F629<br /> INCLUDE P12F629.INC<br /> __CONFIG _INTRC_OSC_NOCLKOUT & _PWRTE_ON & _WDT_OFF & _BODEN_OFF & _MCLRE_OFF<br /> ;***************_int_register_**************************************<br /> time equ H’20’<br /> cnt1 equ H’21’<br /> cnt2 equ H’22’<br /> cnt3 equ H’23’<br /> cnt4 equ H’24’<br /> cnt_pwm equ H’25’<br /> cnt_off equ H’26’<br /> temp equ H’27’<br /> recnt equ H’28’<br /> ;*******************************************************************<br /> org H’00’<br /> goto SETUP<br /> ;***************_warikomi_******************************************<br /> org H’04’<br /> retfie<br /> ;***************_setup_*********************************************<br /> SETUP<br /> bsf STATUS,RP0<br /> call H’3ff’<br /> movwf OSCCAL<br /> movlw B’00000000′ ;all_output<br /> movwf TRISIO<br /> movlw B’00000000′ ;pulup_enable<br /> movwf OPTION_REG<br /> bcf STATUS,RP0<br /> clrf GPIO<br /> movlw B’00000111′ ;dejital I/O<br /> movwf CMCON</p> <p>;***************Main***************************<br /> MAIN ;max199<br /> movlw D’8′<br /> call PWM<br /> movlw D’14’<br /> call PWM<br /> movlw D’20’<br /> call PWM<br /> movlw D’30’<br /> call PWM<br /> movlw D’40’<br /> call PWM<br /> movlw D’50’<br /> call PWM<br /> movlw D’60’<br /> call PWM<br /> movlw D’70’<br /> call PWM<br /> movlw D’80’<br /> call PWM<br /> movlw D’90’<br /> call PWM<br /> movlw D’100′<br /> call PWM<br /> movlw D’120′<br /> call PWM<br /> movlw D’150′<br /> call PWM<br /> movlw D’199′<br /> call PWM<br /> movlw D’199′<br /> call PWM<br /> movlw D’199′<br /> call PWM<br /> movlw D’150′<br /> call PWM<br /> movlw D’120′<br /> call PWM<br /> movlw D’100′<br /> call PWM<br /> movlw D’90’<br /> call PWM<br /> movlw D’80’<br /> call PWM<br /> movlw D’70’<br /> call PWM<br /> movlw D’60’<br /> call PWM<br /> movlw D’50’<br /> call PWM<br /> movlw D’40’<br /> call PWM<br /> movlw D’30’<br /> call PWM<br /> movlw D’20’<br /> call PWM<br /> movlw D’14’<br /> call PWM<br /> movlw D’10’<br /> call PWM<br /> movlw D’6′<br /> call PWM<br /> movlw D’4′<br /> call PWM<br /> movlw D’3′<br /> call PWM<br /> movlw D’2′<br /> call PWM</p> <p> call WAIT1S<br /> call WAIT1S</p> <p> goto MAIN</p> <p>;**************pwm***********************<br /> PWM<br /> movwf temp<br /> movlw D’1′<br /> movwf recnt<br /> REPWM<br /> movlw D’180′<br /> movwf time<br /> WIDTH<br /> movf temp,0<br /> movwf cnt_pwm<br /> movlw D’200′<br /> movwf cnt_off<br /> movf temp,0<br /> subwf cnt_off,1<br /> bsf GPIO,1<br /> WAIT_ON<br /> decfsz cnt_pwm<br /> goto WAIT_ON<br /> bcf GPIO,1<br /> call WAIT_OFF<br /> decfsz time,1<br /> goto WIDTH<br /> decfsz recnt,1<br /> goto REPWM<br /> retrn<br /> ;***************wait_off_time**********<br /> WAIT_OFF<br /> decfsz cnt_off<br /> goto WAIT_OFF<br /> return<br /> ;******************_1ms_*******************************************<br /> WAIT1M<br /> movlw D’256′<br /> movwf cnt1<br /> TIMLP1<br /> nop<br /> decfsz cnt1,1<br /> goto TIMLP1<br /> nop<br /> return<br /> ;******************_10ms_(10.036ms)**********************************<br /> WAIT10M<br /> movlw D’10’<br /> movwf cnt2<br /> TIMLP2<br /> call WAIT1M<br /> decfsz cnt2,1<br /> goto TIMLP2<br /> return<br /> ;******************_50ms_(50.156ms)**********************************<br /> WAIT50M<br /> movlw D’50’<br /> movwf cnt3<br /> TIMLP3<br /> call WAIT1M<br /> decfsz cnt3,1<br /> goto TIMLP3<br /> return<br /> ;*******************_1s_(1.000755)***********************************<br /> WAIT1S<br /> movlw D’250′<br /> movwf cnt4<br /> TIMLP4<br /> call WAIT1M<br /> call WAIT1M<br /> call WAIT1M<br /> call WAIT1M<br /> decfsz cnt4,1<br /> goto TIMLP4<br /> return</p> <p>;**********************_kousei_*************************************<br /> org H’3ff’<br /> retlw H’34’</p> <p> end<br />
アセンブリで185行なのがC言語で10行。そもそもsinが使えるのが大きいです。
時代の進化を感じます。
みんなもLEDチカチカしようぜ
[ad][ad]
Lチカたのしいよね!
最近してる?