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の時間比率を変える制御です。
時間比率を連続的にかえたのがこちら
実際のソースがこちら
1 2 3 4 5 6 7 8 9 10 | <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で同じ事をしたのがこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | <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チカたのしいよね!
最近してる?