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

あむちょです。

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

PR アプリ作ってます

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

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

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

今回やったこと

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

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

arduino

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

[amazonjs asin=”B0025Y6C5G” locale=”JP” title=”Arduinoをはじめようキット”]

今回使ったのは、スタンダードな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制御

実際のソースがこちら

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 &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で同じ事をしたのがこちら

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 &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チカチカしようぜ

[amazonjs asin=”487311537X” locale=”JP” title=”Arduinoをはじめよう 第2版 (Make:PROJECTS)”]
[ad][ad]

2 Comments

あむちょ へ返信する コメントをキャンセル