2015年07月29日

Arduino(5) ブロック崩しを作ってみる(2)

前回に続き、今回はブロック崩しのメインとなる、ブロックとボールの衝突処理を実装します。

まずブロックの画面上での配置です。

画面は30×40に分割します。これは前回書いたとおりです。
描画のとき以外は、全てこの30×40の座標系の上で処理を行います。

ブロックのサイズは3×2とします。
これを横方向に10個、縦方向に5個並べます。
ブロックの総数は50個となります。

各ブロックは、下図のように番号で表します。
arduino04-1.jpg

ブロックが存在している・いないを表すために、論理型の配列existを定義します。
例えばexist[k]==trueなら、k番のブロックは消されずに残っています。
#define BLOCKWIDTH 3
#define BLOCKHEIGHT 2
#define BLOCKTOP 3
#define BLOCKBOTTOM 12
#define BLOCKLINES ((BLOCKBOTTOM-BLOCKTOP+1)/BLOCKHEIGHT)
#define NBLOCKS (BLOCKLINES*SCRNWIDTH/BLOCKWIDTH)

boolean exist[NBLOCKS];

関数BlocksInit()は、この配列の全要素をtrueで初期化します。
関数BlocksLeft()は、全要素中のtrueの個数を返します。
BlocksLeftの結果が0であれば、ステージをクリアしたことになります。
void BlocksInit()
{
int8_t i;

for(i=0; i<NBLOCKS; i++) {
exist[i] = true;
}
}

uint8_t BlocksLeft()
{
int8_t i;
int8_t leftBlocks;

leftBlocks = 0;
for (i=0; i<NBLOCKS; i++){
if (exist[i])
leftBlocks++;
}
return leftBlocks;
}


次に、ブロックの描画と消去です。

使用しているLCDは240×320ピクセルですので、1×1の領域は8×8ピクセルとなります。
プログラム内での座標を描画用座標を変換するマクロTOSCRNを定義します。
また、ブロックの各行の色を配列colorsに格納しておきます。
#define TOSCRN(v) (v<<3)
uint16_t colors[BLOCKLINES]={RED,GREEN,BLUE,YELLOW,MAGENTA};

ブロック崩しでは最初に全てのブロックを表示し、ゲーム開始後はボールが当たったブロックを一つずつ消していきます。
関数BlocksDrawAllは全てのブロックを描画します。
関数BlocksEraseOne(n)は、n番のブロックを消去します。
void BlocksDrawAll(){
int8_t x,y;
int8_t w,h;
int8_t c;
int8_t i;

w=TOSCRN(BLOCKWIDTH);
h=TOSCRN(BLOCKHEIGHT);
c=0;
i=0;
for(y=BLOCKTOP; y<=BLOCKBOTTOM; y += BLOCKHEIGHT) {
for(x=0; x<SCRNWIDTH; x += BLOCKWIDTH) {
if (exist[i++]) {
tft.fillRect(TOSCRN(x), TOSCRN(y), w, h, colors[c]);
}
}
c++;
}
}

void BlocksEraseOne(int8_t block) {
int8_t x,y;
int8_t w,h;
int8_t rows;

w=TOSCRN(BLOCKWIDTH);
h=TOSCRN(BLOCKHEIGHT);
rows = SCRNWIDTH/BLOCKWIDTH;
x = (block % rows) * BLOCKWIDTH;
y = (block / rows) * BLOCKHEIGHT + BLOCKTOP;
tft.fillRect(TOSCRN(x), TOSCRN(y), w, h, BLACK);
}


そしていよいよ、ブロックとボールの衝突の処理です。

まず、ブロックとボールが衝突したかどうかの判定は、比較的簡単です。
ボールが移動しようとしている位置にブロックが存在していれば、そのブロックと衝突したと判定できます。

一方、衝突したあと、ボールを跳ね返らせる処理は、やや複雑です。
ぶつかる瞬間のボールとブロックの位置関係により、下図のような場合があることが判ります。
それぞれに応じた跳ね返り方向を設定することが必要です。
arduino04-2.jpg

今回はボールの跳ね返りを以下のように決定しています。

ボールの移動方向を(vx,vy)とすると、

(1)ボールを(vx,0)だけ移動するとブロックに衝突するならば、水平方向に跳ね返る。
(2)ボールを(0,vy)だけ移動するとブロックに衝突するならば、垂直方向に跳ね返る。
(3)ボールを(vx,vy)だけ移動するとブロックに衝突するならば、水平かつ垂直方向に跳ね返る。
(4)以上をボールが跳ね返らなくなるまで繰り返す。

(1)(2)は同時に起こる場合がある(上図の右上のパターン)ので、(4)の処理が必要になります。

関数BlocksFindは、与えられた座標のブロック番号を返します。
ブロックが存在していても存在していなくても動作は同じです。
関数BlocksHitは、ボールの座標と移動ベクトルから、ブロックとの衝突有無を判断します。
衝突していなければ、-1を返します。
衝突していた場合は、衝突したブロックの番号を返すと共に、ボールの跳ね返る方向へ移動ベクトルの値を書き換えます。
int8_t BlocksFind(uint8_t x, uint8_t y)
{
if (x > SCRNWIDTH) {
return -1;
}
if ((y < BLOCKTOP)||(y > BLOCKBOTTOM)) {
return -1;
}
uint8_t rows=SCRNWIDTH/BLOCKWIDTH;
return (y-BLOCKTOP)/BLOCKHEIGHT*rows + x/BLOCKWIDTH;
}

int8_t BlocksHit(uint8_t x, uint8_t y, int8_t *vx, int8_t *vy)
{
int8_t block;

block = BlocksFind(x + *vx, y);
if ((block >= 0) && exist[block]) {
*vx = -*vx;
return block;
}
block = BlocksFind(x, y + *vy);
if ((block >= 0) && exist[block]) {
*vy = -*vy;
return block;
}
block = BlocksFind(x + *vx, y + *vy);
if ((block >= 0) && exist[block]) {
*vx = -*vx;
*vy = -*vy;
return block;
}
return -1;
}


最後に、ゲームの状態遷移です。

ブロックを全部消したら、ゲームを再開する処理が必要になります。
このため、ゲームには

●ゲーム中
●ステージクリア後のゲーム再開待ち

の二つの状態を持たせます。
#define GAME_ONGOING 1
#define GAME_RESTART 0

uint8_t gameStatus;

また、ゲーム再開の処理では、プレイヤーを混乱させないようボールの座標はリセットしないことにします。
すると、ブロックを描画したい領域からボールが出ていくまでは、再開処理を行えなくなります。
ゲーム再開待ち状態では、ボールがブロックの描画領域よりも画面下方にあり、かつ移動方向がも下向きとなったときにブロックの描画を行います。

関数game_restartがこの処理を行います。
この関数は、ブロックを描画できたときにtrue、まだボールが出て行くのを待っている場合はfalseを返します。
関数game_ongoingはボール とブロックの衝突判定を行い、衝突したらそのブロックを消去します。
boolean game_restart()
{
if ((ball.y > BLOCKBOTTOM) && (ball.vy >0)) {
BlocksInit();
BlocksDrawAll();
return true;
} else {
return false;
}
}

void game_ongoing()
{
int8_t block;

do {
block=BlocksHit(ball.x,ball.y,&ball.vx,&ball.vy);
if (block >= 0) {
exist[block] = false;
BlocksEraseOne(block);
}
} while (block > 0);
}


そして、loop()の中で、状態遷移の管理を行います。
void loop()
{
switch (gameStatus) {
case GAME_RESTART:
if (game_restart()) {
gameStatus = GAME_ONGOING;
}
break;
case GAME_ONGOING:
game_ongoing();
if (BlocksLeft() == 0) {
gameStatus=GAME_RESTART;
}
break;
}
(以下は前回と同じなので略)

最後にスケッチファイルと、動作の様子のビデオを置いておきます。
ino-icon.pngbreakout2.ino

posted by boochow at 01:40| Comment(0) | Arduino | このブログの読者になる | 更新情報をチェックする

2015年07月26日

Arduino(4) ブロック崩しを作ってみる(1)

Arduinoでカラー液晶に表示ができるようになったので、ゲームを作ってみたいと思います。

といっても、ArduinoはCPUパワーもありませんし、描画はLCDのコントローラ任せなので、こちらも期待できません。
というわけで、比較的描画量の少ないゲームとして、「ブロック崩し」を選んでみました。


Arduinoのプログラミング言語は「Arduino言語」と呼ばれていますが、実態はほぼC言語で、それにArduino特有のお約束事がついている感じです。

もっとも基本的なお約束は、プログラム(Arduinoがスケッチと呼んでいるもの)は2つの関数setupとloopを定義するものである、ということです。
setup()が最初に1回呼ばれ、そのあとloop()が繰り返し呼び出されます。
(従って、通常loop()自体はループ1回分の処理しか行いません。)

基本的な事柄は

Arduino 日本語リファレンス

を見てください。
setupとloopと一般的なC言語におけるmain関数との関係については

Studio Gyokimae

が参考になります。


今回は、まずはボールを画面の中で動かすところを作ってみます。

IDEのメニューから「新規ファイル」を選ぶと、以下のような雛形が現れます。
void setup() {
// put your setup code here, to run once:

}

void loop() {
// put your main code here, to run repeatedly:

}

この二つの関数を埋めればよいわけですが、今回は、setup()で必要な処理はLCDと変数の初期化だけです。
LCDの初期化は前回のgraphicstestなどのサンプルスケッチのsetup()をそのまま流用します。

loop()では、ボールが画面の端へ行ったら跳ね返るようにします。
ゲームではおなじみの処理ですね。
ついでですので、ラケットも描いて、ラケットはボールの位置に自動追従するようにしてみましょう。

プログラムはこんな感じです。
青い部分はサンプルスケッチからコピーしてきている部分です。
赤い部分がボールの処理、ピンクの部分はラケットの処理の部分です。

#include // Core graphics library
#include // Hardware-specific library

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
// optional
#define LCD_RESET A4

// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

#define RACKETSIZE 8
#define RACKETLINE 37
#define SCRNWIDTH 30
#define SCRNHEIGHT 40

typedef struct
{
uint8_t x,y;
int8_t vx,vy;
} Ball;

#define BallInit(ball) ball = {.x = SCRNWIDTH-1, .y = SCRNHEIGHT-SCRNWIDTH, .vx = -1, .vy = 1}
#define BallDraw(ball,tft,color) tft.fillRect(ball.x<<3, ball.y<<3, 8, 8, color)

#define RacketDraw(racket,tft,color) tft.fillRect(racket<<3, (RACKETLINE+1)<<3, RACKETSIZE<<3, 8, color)

#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#define MIN(a,b) (((a) < (b)) ? (a) : (b))

int16_t racket=(SCRNWIDTH-RACKETSIZE)>>1;
Ball ball;

void setup(void) {
tft.reset();
uint16_t identifier = tft.readID();
tft.begin(identifier);
tft.fillScreen(BLACK);

BallInit(ball);
}


void loop()
{
BallDraw(ball, tft, BLACK);
ball.x += ball.vx;
if (ball.x >= SCRNWIDTH - 1 || ball.x < 1) {
ball.vx = -ball.vx;
}
ball.y += ball.vy;
if (ball.y == RACKETLINE) {
if (ball.x >= racket && ball.x < racket+RACKETSIZE) {
ball.vy = -ball.vy;
}
}
if (ball.y == 0) {
ball.vy = -ball.vy;
}
if (ball.y > SCRNHEIGHT) {
BallInit(ball);
}
BallDraw(ball, tft, YELLOW);

RacketDraw(racket,tft,BLACK);
racket=(ball.x)-(RACKETSIZE>>1);
racket=MAX(0, racket);
racket=MIN(racket, SCRNWIDTH-RACKETSIZE);
RacketDraw(racket,tft,WHITE);

delay(16);
}


今回は全ての処理を8ドット単位で行うことにしました。
LCDは240×320ピクセルですが、これを30×40の画面として使うことになります。
このほうが、将来いろいろな解像度の液晶に移植しやすいのではないかと考えたためです。

そのため、座標系は画面の左上(USBジャックのある側が上)を原点として、

X軸:0..29
Y軸:0..39

となります。

ボールの変数は、位置を表す(x,y)、それに水平・垂直方向の移動量を現す(vx,vy)が必要です。
Arduino言語はC言語ですので、構造体が使えます。
ということでBall型を定義しました。

しかし残念なことに、「構造体typedefした型を引数とする関数」はスケッチの中では定義できません。(typedefせずにstructのままなら引数で渡せます。)
これを行うには、構造体をtypedefを別ファイルで定義するか、typedef後に関数のプロトタイプを明示的に宣言する(→解説必要があるようです。
そこで、とりあえず初期化と描画の2つの処理を、関数ではなくマクロとして定義しました。


なお、Arduino言語ではクラス定義も(一応)行えますが、今回は使っていません。
クラス定義も構造体同様に「ライブラリ」として、ファイルを分けて定義しなければならないためです。

構造体とそれを扱う関数、あるいはクラス定義、については別ファイル(.c、.cpp、.hの拡張子を持つファイル)でライブラリとして定義し、スケッチからはインクルードして使用せよというのがArduinoの思想のようです。


最後の delay関数は、msec単位でのウエイトを行います。約1/60秒ということになります。
loop()を抜けると、またloop()の先頭から実行されます。

posted by boochow at 20:10| Comment(2) | Arduino | このブログの読者になる | 更新情報をチェックする

2015年07月18日

Arduino(3)続・カラーLCDを接続してみる

前回はArduino UNOにaitendoの2.4インチカラーLCD「UL024TF」を接続し、表示ができることを確認しました。

UL024TFには、このほかにmicroSDカードインタフェースとタッチパネルが組み込まれています。これで1,500円とは安いですね。

さて今回は、Adafruit TFTLCD-Libraryに付属している残りのサンプル、「rotationtest」「tftbmp」「tftpaint」を動かしてみます。

1.rotationtest

rotationtestは、その名の通り画像を回転表示するテストです。
回転といっても任意の角度ではなく、90度ずつ回転するだけですが・・・。

まずは試してみましょう。
前回同様、メニューから「ファイル」→「スケッチの例」→「TFTLCD-Library-master」で「rotationtest」を選択し、「→」ボタンでコンパイルしてArduinoに書き込みます。

このプログラムは、Arduinoがシリアルポートから何か受信するごとに表示を90度回転させるようになっています。
IDE内蔵のターミナルウインドウを呼び出しましょう。
「ツール」メニューの「シリアルモニタ」を選択すると、ターミナルウインドウが表示されます。
arduino013.jpg
arduino014.jpg

このプログラムに限らず、シリアルポートはArduinoとのほとんど唯一の通信手段ですので、エラー等を確認したいときはとりあえずシリアルモニタを呼び出してみるのが良いでしょう。

rotationtestでは、シリアルモニタの「送信」ボタンを押すと(文字は何も入れる必要なし)、Arduinoから0,1,2,3という数字が送られてきて、その都度表示が回転します。

表示の内容は
「ピクセル」→「斜線」→「縦横直線」→「矩形」→「塗りつぶし矩形」→「円」→「塗りつぶし円」→「テキスト」
の順で変化します。「ピクセル」は1ピクセルだけの描画ですので、よく見ないと見つからないかもしれません。

2.tftbmp

tftbmpは、microSDカードから画像を読み出してLCDに表示するデモプログラムです。
フォトフレームの簡易版と思えば良いでしょう。

このプログラムは、microSDカードから"woof.bmp"および"miniwoof.bmp"というファイルを読み出して、それをLCDに表示します。
microSDカードを用意し、TFTLCD-Libraryの「bitmaps」フォルダ(ライブラリ\ドキュメント\Arduino\libraries\TFTLCD-Library-master\bitmaps)に入っている"woof.bmp"と"miniwoof.bmp"をmicroSDカードへコピーして、それをUL024TFのmicroSDカードホルダへセットしてください。

tftbmpを実行すると、画像が表示されます。
arduino011.jpg

正直なところ画質は悪いです。このLCDは写真の表示には向いていませんね。


3.tftpaint

tftpaintは、その名の通りタッチパネルでお絵描きをするデモです。
このプログラムは、追加のライブラリおよび若干のプログラムの修正が必要です。

まず、以下からタッチパネルのライブラリをダウンロードし、IDEのライブラリに追加します。
ダウンロードからライブラリ追加までの方法は、前回の記事で書きました。
adafruit/Touch-Screen-Library ・ GitHub

次に、「スケッチの例」の「TFTLCD-Library-master」からtftpaintを開きます。

そして、以下のように修正を行います。

スクロールバーが上から1/4くらいの位置、赤い箇所を修正
//   D5 connects to digital pin 38
// D6 connects to digital pin 39
// D7 connects to digital pin 40

#define YP A3 // must be an analog pin, use "An" notation!
#define XM A2 // must be an analog pin, use "An" notation!
#define YM 9 // can be a digital pin
#define XP 8 // can be a digital pin

#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940


スクロールバーが下から1/4くらいの位置、赤い行を追加
    if (p.y < (TS_MINY-5)) {
Serial.println("erase");
// press the bottom of the screen to erase
tft.fillRect(0, BOXSIZE, tft.width(), tft.height()-BOXSIZE, BLACK);
}
// scale from 0->1023 to tft.width
p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);
p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);
p.x = 240-p.x;
p.y = 320-p.y;



以上の修正で、UL024TFのタッチパネルを使うことができます。
色を選択する以外、ほとんど何もできないお絵描きソフトではありますが、ちゃんと動きます。
画面最下部(USBジャック側)をタッチすると画面をクリアします。

arduino010.jpg
posted by boochow at 21:20| Comment(0) | Arduino | このブログの読者になる | 更新情報をチェックする

Arduino(2)カラーLCDを接続してみる

今回はArduino UNOにカラー液晶パネルを接続して、まずは表示ができることを確認してみます。

液晶パネルは、aitendoで1480円(税別)で購入できる「UL024TF」というカラーLCDシールドを使います。
arduino-012.jpg

この製品は、Arduinoに接続するためのピンヘッダが最初から基板に取り付けられています。
このような、Arduinoボードに接続できるように設計された拡張ボードは「シールド」と呼ばれています。

UL024TFは2.4インチのTFT LCDで、解像度は240x320ピクセルです。
microSDカードスロットも実装されています。
また、aitendoの商品説明では
※4線抵抗膜型タッチスクリーンが付いているが、接続が行われていないので使用できません

とありますが、少なくとも私の購入したものはタッチスクリーンを使用できました。


それでは、まずはPCをArduinoのプログラミングができる状態にしましょう。

以下のページからArduino用の開発環境(IDE)をダウンロードし、インストールします。

Arduino - Software

この記事を書いている2015年7月現在の最新版は1.6.5でした。
なお、インストール中に3回ほど、「このドライバをインストールしますか」と訊かれますが、もちろんインストールしてください。

arduino001.jpg

インストールが完了したら、USBケーブルでPCとArduinoを接続します。
IDEが正常にインストールされていれば、Arduino用のドライバが自動でインストールされるはずです。
デバイスマネージャで確認すると、Arduinoは「シリアルポート」として認識されています。
arduino001b.jpg

次にIDEを起動します。
まず最初に使用するボードの選択と、Arduinoのシリアルポートの選択が必要です。
これらは「ツール」メニューから選択できます。
arduino002.jpg
arduino003.jpg

そして、まずはLEDをチカチカさせる、通称「Lチカ」で動作確認です。
この例題は、最初からIDEに含まれています。
メニューから「ファイル」→「スケッチの例」→「01.Basics」→「Blink」を選択します。
arduino004.jpg

するとウインドウが開きますので、ウインドウ左上、「ファイル」メニューの下の丸い「→」ボタンをクリックします。
これで、あとは自動的にプログラムがコンパイルされ、Arduinoへ転送されます。
無事転送されれば、プログラムは勝手に起動し、ボード上の小さなLEDが点滅するはずです。
arduino005.jpg


普通は、このあとスイッチやセンサの読み取り、サーボモータの制御などの様々な例題にチャレンジします。
しかし、私自身はあまり興味が無いので省略します。
Arduinoで動く例題の解説は既にネット上に沢山ありますし、「Arduinoをはじめよう」といった書籍も出版されていますので、興味のある方はそちらを参照してください。


それでは、ともかくLCDをつないでみましょう。
使うのは先に書いたaitendoのLCD「UL024TF」です。


まず、このLCDを動かすには、IDEにライブラリを追加する必要があります。
ライブラリのダウンロード先は、
adafruit/TFTLCD-Library ・ GitHub

adafruit/Adafruit-GFX-Library ・ GitHub

の2つです。

いずれも、ページの右側の「Download Zip」ボタンでダウンロードします。
arduino006.jpg


ライブラリを追加するには、IDEの「スケッチ」→「Include Library」→「Add ZIP Library...」でダウンロードしたZIPファイルを指定します。
すると、ZIPファイルは展開されて「ライブラリ\ドキュメント\Arduino\Libraries」フォルダへコピーされます。
arduino007b.jpg

二つのライブラリを追加すると、IDEの「スケッチの例」メニューの中に新しい項目「TFTLCD-Library-master」が追加されます。
これでライブラリの追加は完了です。
arduino007.jpg

なお、ライブラリを手動で追加する場合も、フォルダを「ライブラリ\ドキュメント\Arduino\Libraries」へコピーすればよいようです。

Arduino - Libraries

次に、LCDをArduinoに取り付けます。
これは単にピン位置を合わせて押し込むだけです。
arduino008.jpg

きちんと取り付けられたら、USBポートでPCと接続します。

このとき、LCDのバックライトの電源が入るはずですが、何の変化も起こらなければ接触不良の可能性があります。
実は私の入手したものも、若干の接触不良箇所があるようで、パネルを指で押すと接続できたりできなかったりするという現象がありました。
テストするだけなら問題ないのでそのまま使っていますが、値段なりの品質ということかもしれません。

Arduinoが接続できたら、先ほど説明した「スケッチの例」→「TFTLCD-Library-master」から、「graphicstest」を選択してください。
そして、「→」ボタンでコンパイルしてArduinoへ転送します。

これで、LCD上でグラフィックスのデモが表示されるはずです。
(下のビデオは、同じデモを別のLCDモジュールで動かしていますが、UL024TFでも動作は同じです。)
posted by boochow at 17:01| Comment(0) | Arduino | このブログの読者になる | 更新情報をチェックする

2015年07月17日

Arduino(1)ArduinoとAVR

このところ、プチコンにもちょっと飽きてきましたので、唐突ですがこれからしばらく、Arduino(アルドゥイーノ)をいじってみることにします。

Arduinoは、元来は教育用のマイコンボードです。
様々なバリエーションがありますが、最もポピュラーな「Arduino UNO」は名刺程度の大きさで、USBでPCに接続すれば、PC側の開発ツールでArduinoボードに接続したセンサなどを制御するプログラムを作成できます。

価格も、正規品で3000円前後と、比較的入手しやすくなっています。
「UNO」とLEDやスイッチ、センサ、抵抗器など基本的なパーツをセットにした「Arduinoをはじめようキット」を買えば、センサの値を読み取ったりLEDを点滅させたりといった、プチコンとは一味違うプログラミングを始められます。
(ちなみにUNOはイタリア語で「1」、Arduinoはイタリアの製品です。)

arduino-uno.jpg


…という感じで持ち上げておきながら、実はこれまで私は、Arduinoにさほど関心を持っていませんでした。

Arduinoの心臓部はATMEL社のAVRという8bit CPUです。
上の写真では右下に写っている一番大きなICがAVRです。
AVRはフラッシュメモリ、SRAM、EEPROMとADコンバータやタイマなどを内蔵しており、適切なツール(プログラマとかライタと言います)を使ってプログラムを内蔵フラッシュへ書き込めば、最小限の外付け部品で、動くシステムを作成することができます。

Arduinoの登場以前から、AVRはPICと並んで、ホビイストの間では非常にポピュラーなマイコンでした。価格は100円〜200円と安価で、DOS上で動作するCコンパイラなどの開発環境がATMELから配布されており、PCのパラレルポートやシリアルポートに簡単な回路を付加すればコンパイルしたプログラムをAVRに書き込むことができました。

以下のサイトは当時お世話になっていたサイトで、AVRのプログラマの製作方法や様々なライブラリなどが数多く紹介されています。

ELM - Atmel AVRについて

AVRライタの製作 (4種)

当初、私にはArduinoは学生向けの授業に使うような教育「専用」のボードに見えていました。
実際、ArduinoでできることはAVRでできることそのものであり、Arduinoで再度AVRを学習しようという気にはなりませんでした。

ところが、Arduinoの登場から数年経った頃から、ちょうど中国が世界の秋葉原として多様な電子部品を供給しはじめたこともあり、Arduino用の様々なパーツが安価に流通し始めました。
同時に「Arduino用のソフトウェア」もパーツと合わせて配布されるようになりました。

その結果、Arduinoは単なる教育用マイコンボードから、かつてのDOS/V PCのような「オープンなハードウェア規格」へと変わり、ハード・ソフトのパーツを組み合わせて手軽にプロトタイプを作成することができるようになりました。

例えば3Dプリンタの制御エンジンなども、Arduinoを使って開発している人達がいます。
また、Googleが発表した、Androidの周辺機器をArduinoで開発できる「Android Open Accessory Development Kit」も大きな話題となりました。


私自身は、昨年の夏ごろ、Arduino用の様々な「フルカラーのLCD」が1000〜2000円程度で入手できるようになっているのに気付き、Arduinoへの評価が変化しました。

昔、AVRを使っていたころは、カラーLCDは高値の花でした。
価格自体も数千円はするものでしたし、CPUとの結線、バックライト用電源の準備、制御ソフトウェアの作成、描画ルーチンの作成、といったハードルを一つ一つ超える必要がありました。
私も、簡単に使えるキャラクタ液晶モジュールの利用で済ませていました。

その憧れのカラー液晶が安価かつ簡単に使えるようになったのを知り、ちょっと手を出してみようという気になったのです。

というわけで、次の記事では早速、ArduinoにカラーLCDを接続してみます。
posted by boochow at 00:41| Comment(0) | Arduino | このブログの読者になる | 更新情報をチェックする
人気記事