C言語で書ける幸せ、Arduinoはじめました

あむちょです。

初めてのプログラミングはPICでアセンブリでした。

PR アプリ作ってます

その後、大学でC言語を学び、研究室で制御っぽい事してました。

そして現在、なんやかんやで気づいたらアプリの会社(あまり作ってない)やることになってました。

アプリやパソコン上で動くプログラムばかり作っていると、無性にLEDをチカチカさせたくなるので、はやりのArduinoに手をだすことに。

今回やったこと

そもそもArduinoとは、いわゆるマイコンボードです。以前紹介したWebリモコンのIrkitもArduinoの派生で作られてます。

Raspberry Piがパソコンよりなのにたいし、Arduinoは組み込みよりなきがします。

arduino

下がArduinoで、Raspberry Piより一回り小さいぐらい。

今回使ったのは、スタンダードなArduino UNOです。スペックはクロック16MHz、デジタルI/O20本、アナログ入力6本とマイコンとしてはぼちぼち使えます。

開発環境の構築

まずは統合開発環境(IDE)のダウンロード。

ide

本家サイトのダウンロードボタンから該当するOSをクリック。Arduino公式サイト

その後ソフトを起動。

arduino_ide

すごくシンプルです。

チェックマークアイコンでコンパイル、→アイコンでArduinoに書き込みです。

setting

ArduinoをUSBでつなぎ、メニューバーのツール→ポートから/dev/cu.usbmodem~を選択

これだけですぐにでも動かせます。

PICみたいにICをライターに差し替える手間もありません。

write

LEDをPWM制御でふんわりチカチカ

マイコンのHello WorldはLチカ(LEDをチカチカ光らせる)。

LEDのような明るさと電圧が比例しないような時は、明るさを調整するためにPWM制御をします。

PWM制御とはOnとOffを体感できない速さで繰り返し、OnとOffの時間比率を変える制御です。

時間比率を連続的にかえたのがこちら

動画 LEDのPWM制御

実際のソースがこちら

<br />
void setup() {<br />
}<br />
void loop() {<br />
  static float time = 0;</p>
<p>  time += 0.02;<br />
  if(time &gt; 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 &amp; _PWRTE_ON &amp; _WDT_OFF &amp; _BODEN_OFF &amp; _MCLRE_OFF<br />
;***************_int_register_**************************************<br />
time	equ	H&#8217;20&#8217;<br />
cnt1	equ	H&#8217;21&#8217;<br />
cnt2	equ	H&#8217;22&#8217;<br />
cnt3	equ	H&#8217;23&#8217;<br />
cnt4	equ	H&#8217;24&#8217;<br />
cnt_pwm equ H&#8217;25&#8217;<br />
cnt_off equ H&#8217;26&#8217;<br />
temp    equ H&#8217;27&#8217;<br />
recnt	equ	H&#8217;28&#8217;<br />
;*******************************************************************<br />
	org     H&#8217;00&#8217;<br />
	goto	SETUP<br />
;***************_warikomi_******************************************<br />
	org	    H&#8217;04&#8217;<br />
	retfie<br />
;***************_setup_*********************************************<br />
SETUP<br />
	bsf	    STATUS,RP0<br />
	call	H&#8217;3ff&#8217;<br />
	movwf	OSCCAL<br />
	movlw	B&#8217;00000000&#8242;                   ;all_output<br />
	movwf	TRISIO<br />
	movlw	B&#8217;00000000&#8242;                   ;pulup_enable<br />
	movwf	OPTION_REG<br />
	bcf	    STATUS,RP0<br />
	clrf	GPIO<br />
	movlw	B&#8217;00000111&#8242;                   ;dejital I/O<br />
	movwf	CMCON</p>
<p>;***************Main***************************<br />
MAIN                        ;max199<br />
    movlw   D&#8217;8&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;14&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;20&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;30&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;40&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;50&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;60&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;70&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;80&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;90&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;100&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;120&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;150&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;199&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;199&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;199&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;150&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;120&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;100&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;90&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;80&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;70&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;60&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;50&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;40&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;30&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;20&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;14&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;10&#8217;<br />
    call    PWM<br />
    movlw   D&#8217;6&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;4&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;3&#8242;<br />
    call    PWM<br />
    movlw   D&#8217;2&#8242;<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&#8217;1&#8242;<br />
    movwf	recnt<br />
REPWM<br />
    movlw   D&#8217;180&#8242;<br />
    movwf   time<br />
WIDTH<br />
    movf    temp,0<br />
    movwf   cnt_pwm<br />
    movlw   D&#8217;200&#8242;<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&#8217;256&#8242;<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&#8217;10&#8217;<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&#8217;50&#8217;<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&#8217;250&#8242;<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&#8217;3ff&#8217;<br />
	retlw	H&#8217;34&#8217;</p>
<p>	end<br />

アセンブリで185行なのがC言語で10行。そもそもsinが使えるのが大きいです。

時代の進化を感じます。

みんなもLEDチカチカしようぜ


2 Comments

a.craft へ返信する コメントをキャンセル