C言語で書ける幸せ、Arduinoはじめました
あむちょです。
初めてのプログラミングはPICでアセンブリでした。
その後、大学でC言語を学び、研究室で制御っぽい事してました。
そして現在、なんやかんやで気づいたらアプリの会社(あまり作ってない)やることになってました。
アプリやパソコン上で動くプログラムばかり作っていると、無性にLEDをチカチカさせたくなるので、はやりのArduinoに手をだすことに。
今回やったこと
そもそもArduinoとは、いわゆるマイコンボードです。以前紹介したWebリモコンのIrkitもArduinoの派生で作られてます。
Raspberry Piがパソコンよりなのにたいし、Arduinoは組み込みよりなきがします。
下がArduinoで、Raspberry Piより一回り小さいぐらい。
[amazonjs asin=”B0025Y6C5G” locale=”JP” title=”Arduinoをはじめようキット”]
今回使ったのは、スタンダードな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チカチカしようぜ
[amazonjs asin=”487311537X” locale=”JP” title=”Arduinoをはじめよう 第2版 (Make:PROJECTS)”]
[ad][ad]





Lチカたのしいよね!
最近してる?