Arduinoは、Atmel Studioで提供される基本機能を誰にでも分かりやすく簡単に開発できるようにしたものと言える。Atmel Studioで開発する場合、main()からいきなり実行されるだけで、Arduinoに標準で用意されている便利な機能などはない。全て自分で用意しなければいけないので面倒ではあるが、そのかわり全てのHW機能が自由に使えるという利点はある。
当然、ArduinoでもHW機能は自由に使える。Linux/WindowsのようにHWは保護されていないのでライブラリとバッティングする操作でさえも自由に行えるし、HWを直接操作することによりArduinoで提供される機能とは比べようもないくらい高性能かつ高機能なプログラムが実現できる可能性もある。だからライブラリがないからと言って諦める必要など全くない。逆にチャンスでもある。なければ自分で作ればいいのだから。
では、どうすればHWを直接操作できるのか、MCUについてはそのドキュメントに開発環境で使えるシンボル名を含め全てが説明されているので一度読んでみて頂きたい。他のデバイスについてはそのドキュメントを見て自分でHWを理解する必要がある。
例えば、ATtiny85のGPIO操作をArduino(ライブラリ)とAtmel Studio(HW直接操作)で比較すると次のようになる。
1 2 3 4 5 6 7 8 9 |
pinMode(1, OUTPUT); <--> DDRB |= (1 << PB1); pinMode(1, INPUT); <--> DDRB &= ~(1 << PB1); PORTB &= ~(1 << PB1); pinMode(1, INPUT_PULLUP); <--> DDRB &= ~(1 << PB1); PORTB |= (1 << PB1); digitalWrite(1, HIGH); <--> PORTB |= (1 << PB1); digitalWrite(1, LOW); <--> PORTB &= ~(1 << PB1); digitalRead(1); <--> (PINB & (1 << PB1)) ? HIGH : LOW; digitalWrite(1, !digitalRead(1)); <--> PINB |= (1 << PB1); |
Arduinoは、Atmel Studioの開発環境がベースとなっているので上記のどちらを記述しても同じように動作し、HW直接操作はライブラリに比べ数十倍以上も高速に処理できる。
特に処理能力やメモリなどのリソースが少ないMCUではそれらの制約からライブラリが使えないことが多いが、HW直接操作ならできることも多いのは確かだ。極論を言えばアセンブラ言語で開発をと言いたいところだが、GCCの最適化は大変素晴らしくC言語で普通に記述してもアセンブラで記述したのと同等(以上)の効率の良いコードを生成してくれたりもするのであえてアセンブラ言語で記述する必要はないだろう。
HWのことよりアルゴリズムなどのプログラミングを楽しみたいという方は、なんとなく開発環境が整っているLinux/Windowsを選択してしまうのだろうが逆に開発環境が整いすぎていてその豊富なライブラリでなんでもできてしまうためそれらの使い方を覚えただけで満足してしまう人が多いように思われる。そのような人達はライブラリがないと無理ですと当たり前のように言い切ってしまう人達でありプログラミングというのはプラモデルを組み立てるようなものだと大きな勘違いをもしてしまっている。が、そういう単純作業ならロボットに任せればよいのであって人間はもっと創造的な仕事をするべきである。なので本格的にプログラミングを学びたいならArduinoで何か作ってみることをお勧めしたい。Arduinoのような組み込み開発環境ではソートですら自分で作らなければならないというジレンマに陥るが不便だからこそ学べることも多い。アルゴリズムの基礎を学ぶには最適な環境でもあると思う。