Soraken’s Style

つれづれ

磁石とコイルの実験(1)

今回は、ちょっと8pinoやTrinketの話題から離れて、ちょっと前にネットで見つけた実験を再現してみることにしました。

 

元となった動画はこちらです。


World's Simplest Electric Train 【世界一簡単な構造の電車】 - YouTube

 

まずは、この実験をできるだけ同じように再現してみました。

用意したのは、φ0.9mmの銅線5mと、ネオジム磁石を6個、それに単4のアルカリ電池です。(上記の動画では単5を使っているみたいでしたが、手に入りやすい単4でやってみることにしました。)

 

まず、銅線をマジックペンに巻き付けてだいたいφ15mmくらいのコイルにします。つぎに、単4電池の両極にネオジムを3個ずつ重ねてくっつけて、電車の代わりにします。あとはこの電車をコイルに通すだけです。

実際にやってみた様子はこんな感じ。


コイルと磁石と単4電池 - YouTube

単純ですけど、おもしろいですね。

今回は、「まずはやってみた」ってことで、ここで終了。

 

 

 

Trinketのアナログ入力

前回(Trinketで模型用モータを回す(1))はTrinketでモータを回す簡単な実験でした。回すと言っても、単純にOn/Offしているだけで、”制御”しているとは甚だ言い難いレベルでしたね。まぁ、それでも最初の一歩的には全然OKでしょう。

 

さて、今回はもう少しTrinket(というか最終的には8pinoなんですけど)の基本的なところを試してみたいと思います。Trinketは以下のように、5個の出力ピンを持っていますが、そのピンはいろいろな用途に使えるようです。

f:id:soraken:20141229221844p:plain

(Adafruit : https://learn.adafruit.com/assets/13866 より参照)

 

今まで、digitalWrite()でOn/Off出力、analogWrite()でPWM出力と出力方向の制御を試してきましたので、今度は入力方向を試してみたいところです。というわけで、上手を見ると、入力に使えそうなピンが幾つかあります。ググってみると、analogRead()でピンに入力される信号の電圧を0〜1023の値にAD変換して取り込んでくれるみたいです。ピンに掛けられる電圧は5Vでいいようですので、いつものように、手持ちの部品を使って、回路をさくっと作ってみました。

f:id:soraken:20141229223822p:plain

ちょっと見づらいかもしれませんが、Trinketを中心に、まずPB0には前回と同じPWMの出力回路を接続しています。PB0の出力をQ1で受けて、最終的にQ2をドライブしています。Q2の出力側はTPで何でもつなげられるようにしておきました。

今回は更に、PB1に可変抵抗を繋いでいます。単純な抵抗分割で0〜5Vが出力できる物を使っています。

実際の回路はこんな感じです。

f:id:soraken:20141229225033p:plain

 相変わらず雑ですが、手前の可変抵抗でアナログ入力電圧を調整する感じですね。これくらいいい加減でもなんとかなります。

 

今回は、analogRead()でアナログ入力電圧を取り込んで、これを0〜255に変換して(4で割る)、analogWrite()でPWM値として出力するという単純なプログラムでテストしました。

/* AnalogRead Test Analog値を読み取って、PWMデューティー比に変えて出力する */

// Pin 1 has an LED connected on most Arduino boards.

// give it a name: int out = 1;

int val = 0;

int time = 10;

int dir = 1;

// the setup routine runs once when you press reset:

void setup()

{

  // initialize the digital pin as an output.

  pinMode(out, OUTPUT);

}

 

// the loop routine runs over and over again forever:

void loop()

{

  val = analogRead(1) / 4;

  analogWrite(out, val);

  delay(time);

}

 結果はこんな感じ。オシロの水色は入力の電圧(回路図のTP2)、黄色はPWM出力(回路図のTP1)です。


Analog Input Test - YouTube

可変抵抗をグリグリ回すと、水色の入力電圧値が0〜5Vで振れています。これに伴って、出力のPWM波形のデューティーが変わっているのがわかります。あら簡単。

回路上の出力段のTPにLEDをつけて試してみると、ちゃんと調光できてます。これだけで、何かに使えそうですね。

 

という訳で、今回はやや手抜きですが、analogReadを使って電圧信号を入力するテストをやってみました。普通、AD変換とか言うと結構大変な物ですが、これは本当にお手軽でした。今度は、照度センサなんかをつけて、自動で部屋灯の調整をするとかしてもいいかもしれませんね。

(2015.01.23一部修正) 

Trinketで模型用モータを回す(1)

 8pinoの開発者である田中さんが、Facebookでこのサイトを紹介してくださったせいか、11/27だけで(僕にとっては)凄い数の方がここを見に来られているみたい。有り難や〜って、変な記事が書けなくなります(笑)嘘です。まぁ、まったりいい加減に続けて行きます。

 

 いつまでもLEDだけでは飽きてくるので、そろそろ別のものを動かしてみたいなと思って、いろいろと考えてみましたが、お金がかからなくて、簡単に動かせて、そこそこ楽しめるものってなかなかないですね。

 という訳で、とりあえず、手頃な(毎度の事ながら手持ちだった)模型用モータ(マブチモータ:RE-260)を動かしてみようかなと。

 このモータは、だいぶ昔にプラモデルか何かを作った時の残骸だと思うのですけど、手持ちの機材で動かせるものか、わからなかったので、まずは"マブチモータ RE-260"でググってみました。

 グーグル先生によると、このモータはRE-260RAというものらしいです。仕様はこんな感じ。3つモデルがあるようですけど、どれだかわかりません。(笑)

MODELVOLTAGENO LOADAT MAXIMUM EFFICIENCYSTALL
OPERATING
RANGE
NOMINALSPEEDCURRENTSPEEDCURRENTTORQUEOUTPUTTORQUECURRENT
Vr/minAr/minAmN·mg·cmWmN·mg·cmA
RE-260RA 2670 1.5 - 3.0 1.5 6300 0.16 5040 0.64 0.98 10.0 0.52 4.90 50 2.56
18130 1.5 - 4.5 3 6900 0.095 5470 0.36 0.97 9.9 0.56 4.70 48 1.40
2295 1.5 - 4.5 3 9400 0.15 7610 0.64 1.31 13.3 1.04 6.86 70 2.70

 

まぁ、いつもの通り、適当にやってみましょう。

上の表によると、電圧は3V定格(または1.5V定格)のようです。無負荷の時の電流値は多くて150mA程度、起動電流は2.7Aくらいとあります。5Vかけるともっと流れそうです。(単純計算で、4.5Aくらいかな)

 我が家の機材だと、5Vで0.8AのDC電源しかないので、起動トルクで流れすぎないように電流をしぼった方がよさそうです。(電池とかみたいに一瞬なら大量に電流を流せるタイプの電源でもいいのかもしれませんが)

 ちなみに、駆動するのは前回(TrinketでPWM出力(2) )使ったMOSFETですので、こちらは問題ないでしょう。

 以上の事から適当に考えて、以下のような回路を作ってみようと思います。

f:id:soraken:20141202233420p:plain

といっても、ほとんど前回の回路と同じで、抵抗を替えたのとLEDを端子に置き換えただけですけど。TrinketからQ1のNPNトランジスタ、Q2のMOSFETまでの駆動の仕組みは前回の記事をご覧ください。今回は、OUT1とOUT2の間にモータをつなげられるようにしました。また、R3は0.5A程度が流れる事を想定して、モータの端子間抵抗が、3V-2.7Aからざっくりと1Ωとしたら、電源電圧が5Vですから、

 V = IR

    5 = 0.5 × ( 1 + R3 )

 R3 = 9Ω

また、今回は電流が沢山流れる事を想定して、抵抗に加わる電力Wは

 W = VI

   = 5 × 0.5

   = 2.5 watt

と計算しておきましょう。

 ちなみに、一般的な炭素皮膜抵抗や金皮抵抗は1/8 〜 1/4watt程度ですから、今回の実験では、ちょっと物足りない感じです。

 今回は、(何故かたまたま持ってた)3.2Ω/1Wの抵抗(素性不明)を3本直列で9.6Ωにして使ってみました。何故、2.5ワットより少ない物を使うかというと、MOSFETのデューティーでしぼって試そうと思っているからです。本当はちゃんとマージンをとって電力容量に余裕がある部品を使うべきですけどね。手持ちの部品にいつも最適な物がないこともあると思うので、今回は、MOSFETの制御方式で電流を制限して使うことにします。具体的には、On時間を1/5にして、0.5W程度に収まるようにします。将来、モータを自由に動かす時に、もう少しちゃんと回路を考えたいと思います。

 ということで、また例によってブレッドボードでちょこちょこと回路を組んで試してみました。

f:id:soraken:20141129183428p:plain

写真ではあんまりよくわからないかもしれないですね。中央から下へ伸びている緑線と右側から下へ伸びている赤線がモータに接続されています。緑線の根っこの当たりの水色の素子が3.2Ωの抵抗3個です。

 Q2がOnしている時(モータに電流が流れている時)の抵抗の両端の電圧をTP2とTP3で測定してみると、ざっくりと1.6Vくらいでした。

f:id:soraken:20141130001204p:plain

(上図中、CH1がTP2、CH2がTP3です。赤線はCH1-CH2)

ということは、抵抗が9.6Ωなので、抵抗に流れている電流 I が計算できて、

 I = 1.6 / 9.6

   ≒ 170mA

ということになります。また、TP3が2.2V程度になっていますから、Q2のOn時の抵抗Rqは、

 Rq = 2.2 / 0.17

    = 13.2Ω

ということで、以外と大きい事がわかります。

更に、Ch1が3.6Vですから、モータ通電時の見かけ上の内部抵抗Rmは、

 Rm = (5.0 - 3.6) / 0.17

     = 8.4Ω

です。そう言えば、最初に見つけたRE-260RAの仕様では、"2670"の行で、1.5V の時、無負荷時0.16Aとありましたから、ほぼこの状態と同じくらいで回せたという事でしょう。

 

ちなみに、今回のTrinketに書き込んだプログラムは以下の通りでした。

 /*

PWM Pulse Test
デューティー比を10%まで可変して出力する
*/

// Pin 1 has an LED connected on most Arduino boards.
// give it a name:
int motor = 1;
int val = 0;
int time = 10;
int dir = 1;

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(motor, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  if (val == 26) { dir = -1; }
  else if (val == 0) { dir = 1; }
  val = val + dir;

  analogWrite(motor, val);
  delay(time);
}

 ループ内では、デューティーを0から10%の間で増減を繰り返しています。また、同じデューティーで10msec保持しています。(観測しやすいように)

 試しに、モータに色付きの円盤を取り付けて、動いている様子を見てみたのが以下の動画です。  


Trinketでモータを駆動する - YouTube

 

 まぁ、例によっていつものようにかなり乱暴なやり方でしたが、まぁまぁ思った通りモータを動かせたかなと思います。

 ただし、今回はあくまでも「モータがTrinketで動いた」というだけです。ちゃんと「意図した通り(回転数とか角度とか)動かした」というほどではありませんね。

 いつか、もうちょっとまともな動かし方もやってみたいと思いますが、他にもTrinket(というより8pino)を使ってやりたいことがあるので、今後は他の事も試してみたいと思います。今回は、ここまで。

 

 

 

 

 

 

 

 

 

 

TrinketでPWM出力(2)

 前回(TrinketでPWM出力)は、Trinketの出力にNPNトランジスタを接続して、そのトランジスタでLEDをドライブしてみました。

 今回は、トランジスタの先に、更にMOSFETを取り付けて、それでLEDをドライブしてみます。

 早速ですが、以下のような回路を組みたいと思います。

f:id:soraken:20141105220655p:plain

 前回加えたLEDはまた取り外して、R2はまた10kΩに戻しました。代わりに、TP2の先にMOSFETを接続します。Q1のトランジスタMOSFETのベースをドライブする形になります。

 今回使用したMOSFETは、(これもたまたま手持ちだったという理由だけですが)2SJ330というPch MOSFETです。4Vで駆動できるという事ですので、上の回路で十分駆動できるはずです。LEDはMOSFETのソース側に入れました。電流調整のための抵抗R3は220Ωとしてますが、前回と同じ100Ωでも問題ないはずです。MOSFETのドレイン側はGNDに落とします。

 今回の回路の動作はこんな感じになります。

 まず、Trinketの出力がLowの時、Q1のベース電圧は0Vですので、Q1は動作しません。その結果、R2の両端はともに5Vになりますので、Q2のゲート電圧も5Vとなります。このため、Q2のゲートとソース間の電位差はほぼ0Vとなり、Q2の駆動に必要な4Vよりも小さくなるため、Q2は駆動されません。

 次に、Trinketの出力がHighの時、Q1のベース-エミッタ間に電流が流れます。これによって、R2の両端に電位差ができ、TP2は0Vに近くなります。これはQ2のゲート電圧となりますので、Q2のゲート−ソース間に駆動に必要な電位差4V以上が生まれ、Q2が駆動されます。その結果、LEDに電流が流れて光ります。

 

 この回路を動作させた様子が以下の写真です。少しわかりにくいかもしれませんが、右手前の緑色に光っているのがMOSFETでドライブされているLEDです。

f:id:soraken:20141105223016p:plain

 見ての通り、例によってブレッドボード上に手持ちの部品を雑に並べただけなので、お手軽に実験ができました。

 

 これで、少し大き目の電流が必要な負荷もドライブできるようになりました。次回から、大き目の負荷を駆動する実験をやってみたいと思います。

TrinketでPWM出力

前回(TrinketでLEDの続き)、analogWrite()関数を使って、Trinketから2msec周期のPWM出力を行う基本的なテストをやってみました。

このPWM出力がけっこう面白そうなので、今後、いろいろなデバイスにPWMで出力することができるように、Trinketの周辺回路を簡単に作ってみたいと思います。

今回の目標は、

  • 外部から電源を供給する(電池、または外部電源)
  • GPIO#1からの出力をトランジスタで増幅して、多少ドライブ能力を大きくする

をやってみたいと思います。また、今後、回路を説明するのに、回路図があった方がいいと思ったので、Macで使える回路図エディタQt-BSch3V Modifiedを導入してみました。

 

このQt-BSch3Vを使って、今回作成した回路を表すと以下のようになります。

f:id:soraken:20141102223721p:plain

今回は、外部電源を使ってDC5VをTrinketに供給しています。そして、GPIO#1の出力に、R1 1kΩをはさんでQ1 2SC1815(NPNトランジスタ)のベースにつなぎました。Q1のエミッタはGND(グランド)に、コレクタはR2 10kΩを挟んで電源につなぎます。(R2はとりあえずのドライブ負荷ですので、あんまり意味はないです。)この状態で、TrinketのGPIO#1の出力TP1と、Q1のコレクタ端子TP2の電位を計ってみました。

f:id:soraken:20141102224416p:plain

CH1がTP1でCH2がTP2を示しています。

見ての通り、使っているTrinketは内部動作電圧が3.3Vですから、GPIO#1の出力も3.3Vです。一方、外部電源は5Vで供給しましたので、トランジスタのドライブ電源電圧は5Vです。こんな感じで、トランジスタを使って、ドライブ電圧を変換することができるようにしておきましょう。ただし、この時のPWMのOn/Offは逆になっています。

 

ところで、何故、R1を1kΩにしたかですが、一般に2SC1815というNPNトランジスタのベースとエミッタ間の電圧は、流れる電流に関わらず0.7Vくらいです。2SC1815をドライブするには2〜3mAのベース電流で足りるはずですので、Trinketが出力する3.3Vでドライブするとするなら、オームの法則で、

  V = I × R

  R = V / I

   = ( 3.3 - 0.7 ) / 0.002 (または0.003)

   = 1300 (または870)

つまり、870Ω 〜 1.3kΩくらいの抵抗で良いということになります。手持ちでちょうど1kΩを持っていましたので、この範囲に入っている1kΩにしたというわけです。

 

一方、R2を10kΩにした訳は特にありませんが、今回は、トランジスタの出力段は単に電圧を測ることが目的でしたので、トランジスタによってコレクタ部の電圧がしっかりと変化し、かつあんまり電流を消費しない程度ということで、適当に10kΩにしました。

 

では、ドライブするものをR2=10kΩではなく、LEDにしてみたらどうなるでしょうか。早速回路図を以下のように変更してみます。

f:id:soraken:20141103231756p:plain

今度は、出力段にLEDを加えて、R2を100Ωにしました。R2をこの値にした理由は、まず、Q1が適切にドライブされている前提で、先程のオシロの測定結果から、Q1がOnしている時にTP2が0Vになっているので、R2とD1を合わせた電圧は5V(電源から供給される)、今回使ったLEDの仕様がよくわからなかった(その辺にあった物を使った)ので、大体2Vくらいと仮定して、またLEDを光らせるためには20mAかそれ以上あれば一般的に光るだろうけど、ちょっと暗いかもしれないので、マージンをとって30mA(この辺も例によって適当ですが)、またまたオームの法則から、

 V = I × R

 5 = ( 0.03 × R2 ) + 2

 R2 = 3 / 0.03

    = 100 (これ30mAの時)

という感じで決めました。

 

Trinketのプログラムは先程と同じで問題ありませんので、ちくちくちくっとブレッドボード上で回路を組んで、やってみました。 


Trinket PWM LED drive - YouTube

ちゃんと思惑通り、Trinket上の赤いLEDと同じ周期でブレッドボード上の黄色いLEDも明滅しています。ちょっと暗いかな。

 

ここまで結構大雑把にやってきましたけど、そこそこ思った通りにできてよかったです。まあまだLED光らせた(Lチカ)だけですけどね。

 

 

TrinketでLEDの続き

 前回(Trinketと外部電源)やったことは、結局のところ、PWM(Pulse Width Modulation)をゆっくりやってみたってことでしたね。前回は、最終的には25msec(くらい)の周期でOn/Off時のデューティーを変えていた訳ですが、ditialWrite()とdelay()を用いて出力のOn/Offを作っていましたので、時間方向をもっと細かく制御する事は難しそうです。

 

 で、ネットで”Arduino PWM”とググってみると、まぁ、普通にありますよね、ArduinoPWM制御する方法が。

 簡単に言うと、analogWrite()を使って出力する方法です。この方法では、2msecを1周期として、1周期中のOn時間を0〜2msecで変化させられるというものです。デューティーは0〜255の数値で指定するので、2/256msecの分解能ということになります。

この方法だと、高い周波数(短い周期)で、On/Offのデューティーを変えて出力を制御できそうです。早速、前回のプログラムを改造してこのプログラムを作ってみました。

/*
PWM Pulse Test
*/

// Pin 1 has an LED connected on most Arduino boards.
// give it a name:
int led = 1;
int i = 0;
int tim = 1;

// the setup routine runs once when you press reset:
void setup() {
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  analogWrite(led, i);
  delay(1); // wait for a second
  i = i + tim;
  if (i > 255)
  {
    tim = -1;
    i = 254;
  }
  else if (i < 0)
  {
    tim = 1;
    i = 1;
  }
}

 

 このプログラムのポイントは、出力をdigitalWrite()ではなく、analogWrite()で行っているところです。digitalWrite()は指定しているピンを単純にOn/Offしているだけですのが、analogWrite()はある周期の中でデューティーが0〜100%になるように(あたかもアナログ的に)周期的になOn/Offを繰り返すように出力しています。(やっていることはピンのOn/Offである事には変わりませんが、digitalWriteではできない短い周期でOn/Offを行っています)

 

上記のプログラムをTrinketに書き込んで動作させた時の、出力信号の状態はこんな感じでした。


Trinket PWM Output - YouTube

ちゃんと2msec周期で、デューティーが少しずつ増減している事がわかります。

Trinket上のLEDもこんな感じでちゃんと滑らかに明滅します。


Trinket PWM Output 2 - YouTube

うまく使えば、何かの制御にも使えそうですね。

今回は、analogWriteを使ったごくごく基本的な事でしたが、もう少し、digitalWrite、analogWriteの辺で遊んでみたいと思います。

 

Trinketと外部電源

Windowsからの書込みと、簡単なGPIOのデジタル出力はできるようになったので、この辺でTrinketの端子を確認してみます。

Trinketは、Trinketの学習サイトに紹介してあるように、mini-USBからのバス電源供給だけでなく、外部からも電源を供給できるようになっています。では早速、外部からDC5Vを供給してみます。

使ったのは、コーセルさんのDC5V/12V出力のもので、5Vの場合、電流が0.8A流せるものです。

f:id:soraken:20141009220419p:plain

単純に外部電源につないだだけですので、問題なく動作しています。

 

外部電源ならUSBのバス供給より電力が少し多めにとれますので、これでいろいろとやっていきましょう。

 

まず最初に、前回のLEDを光らせるテストで、デジタル出力のパルス幅を変えて光らせた時に、On時のパルス幅が小さくなるとLEDがチカチカしていたので、これを滑らかに(輝度を低くするような感じに)できないかと思います。前回の出力波形はこんな感じでした。(実際には、On/Offのデューティーが少しずつ変わるようにプログラミングしました)On/Offの立ち上がりと立ち下がりがシャープです。ちなみに、1周期は50msecで、On/Off時間を1msecずつ増減させるプログラムでした。

f:id:soraken:20141009225948p:plain

単純には、GPIOの出力とGNDの間にコンデンサを入れれば、立ち上がりと立ち下がりが滑らかになる(俗に”なまる”と言いますね)と思いますので、まずはいつものとおり、深く考えずに手持ちの適当なコンデンサを入れてみます。ちょうど手持ちで47uF 16Vという電解コンデンサがありましたので、これを入れてみた波形が以下の通りです。

f:id:soraken:20141009230250p:plain

確かになまってますが、思ったほどではないみたい。もっと大きなコンデンサの方がいいのかな。というわけで、470uF 16V電解コンデンサに取り替えてみます。

元の波形との差がわかりにくくなったので、同じ信号をGPIO#2にも出して比較してみました。On時間の小さい順に波形をとってみました。

f:id:soraken:20141009233134p:plain

f:id:soraken:20141009233217p:plain

f:id:soraken:20141009233228p:plain

f:id:soraken:20141009233239p:plain

47uFの時に比べても、だいぶ「なまって」ますねぇ。でも、まだ滑らかって感じじゃないですね。さてどうしたものか、、、。

 

そう言えば、コンデンサに電力が溜まる時間ってどれくらいなんだろ。流れる電流の量によりますよね。だとしたら、流れる電流が少ないと溜まるまでに時間がかかるはず。それか、溜まったらすぐに放電してやる(Offにする)といいのかも。ふむふむ。

 

じゃあ、今のプログラムは50msec周期だから、これを半分にしてみよう。というわけで、先程から使っていたプログラムを以下のように変更してみます。

/*

increasing and decreasing pulse Test

*/

// Pin 1 has an LED connected on most Arduino boards.

// give it a name:

int out1 = 1;

int out2 = 2;

int time = 0;

int period = 1;

 

// the setup routine runs once when you press reset:

void setup()

   // initialize the digital pin as an output.

   pinMode(out1, OUTPUT);

   pinMode(out2, OUTPUT);

}

 

// the loop routine runs over and over again forever:

void loop()

{

  if (time >=25)
  {
    period = -1;
  }

  if (time <= 0)

  {

    period = 1;

  }

  time = time + period;

  digitalWrite(out1, HIGH);         // turn the LED on (HIGH is the voltage level)

  digitalWrite(out2, HIGH);

  delay(time);                         // wait for a second

  digitalWrite(out1, LOW);          // turn the LED off by making the voltage LOW

  digitalWrite(out2, LOW);

  delay(25 - time);                // wait for a second

}

 すると、、、。

オシロの波形はまだ多少ガタガタしてますが、LED自体は見事にゆっくり明滅(緩やかに明るくなったり暗くなったり)することができました!

 

今日の感想: チカチカしないっていいね。

 

8pinoとTrinket

ここまで2ヶ月ほど、8pinoで(というより、開発環境側のMacで)苦労してしまいましたが、この8pinoは前回の品モノラボでゲットした貴重な一品。いろいろやっているうちに壊してしまったりすると悲しいので、8pinoのサイトに書かれていたAdafruit社のTrinketを購入することにしました。

 

購入先はスイッチサイエンスさんです。1週間もしないうちに届きました。

8pinoと比べてみたところ。

f:id:soraken:20141008205426p:plain

8pinoの小ささがよくわかります。

これからしばらくは、8pino向けの開発をTrinketでいろいろやってから、最後に8pinoに載せて行く方法を採りたいと思います。

 

で、早速、前回のBlinkプロジェクトをTrinketに書き込んだところが下の図。(あ、ただし、Trinketには付属のピンヘッダを半田づけしました)

f:id:soraken:20141008214952p:plain

8pinoと違って、GPIO#1の出力で赤いLEDが光ります。

 

では、ちょっとプログラムをいじってGPIO#1の出力をテストしてみたいと思います。

今度のプロジェクトは、先程のBlinkプロジェクトを簡単にして、GPIO#1を1msec On、1msec Offで繰り返すプログラムです。

/* Pulse Test Turns on an LED on for 1 mse\, then off for 1msec, repeatedly. */

// Pin 1 has an LED connected on most Arduino boards.

// give it a name:

int led = 1;

// the setup routine runs once when you press reset:

void setup() {

  // initialize the digital pin as an output.

  pinMode(led, OUTPUT);

}

 

// the loop routine runs over and over again forever:

void loop()

{

  digitalWrite(led, HIGH);    // turn the LED on (HIGH is the voltage level)

  delay(1);                         // wait for a second

  digitalWrite(led, LOW);     // turn the LED off by making the voltage LOW

  delay(1);                         // wait for a second

}

 

GPIO#1の出力に10kΩをつけて、TrinketのGNDにプルダウンしておきます。その状態で、GPIO#1の出力をオシロでみたのが下の図です。

 

f:id:soraken:20141008223432p:plain

きれいに1msecでOn/Offしています。うん、ちゃんとできてる。

では、今度は、On/Offの間隔をだんだんと変えるプログラムを試してみます。

/*

increasing and decreasing pulse Test

*/

// Pin 1 has an LED connected on most Arduino boards.

// give it a name:

int led = 1;

int time = 0;

int period = 1;

 

// the setup routine runs once when you press reset:

void setup()

   // initialize the digital pin as an output.

   pinMode(led, OUTPUT);

}

 

// the loop routine runs over and over again forever:

void loop()

{

  if (time >=100)
  {
    period = -1;
  }

  if (time <= 0)

  {

    period = 1;

  }

  time = time + period;

  digitalWrite(led, HIGH);         // turn the LED on (HIGH is the voltage level)

  delay(time);                         // wait for a second

  digitalWrite(led, LOW);          // turn the LED off by making the voltage LOW

  delay(100 - time);                // wait for a second

}

 loop()関数の中でdelayの時間を+1したり-1したりしています。if文で上限下限を見ているのがポイントですかね。

これを例によってコンパイルして書き込んで、オシロで波形を見てみたらこんな感じ。点灯時間が長い時と、短い時の2つの波形を別々にとってみました。

f:id:soraken:20141008230722p:plain

f:id:soraken:20141008230730p:plain

うん。これもまあまあ思った通りに光ってますね。ちょっと点灯時間が短い時にLEDがチカチカするので、この部分を滑らかに光らせるといいかもしれませんね。

 

 

8pino - Arduino お作法の習得

さて、Arduino IDEがなんとかインストールできたので、これでプログラムを書いて目標へ近づきたいと思います。

(その前に、この記事は2ヶ月ほど前から書き始めてましたが、途中、いろいろとつまずいて、今に至る感じでした。読んでくれている方は少ないと思いますが、誰にともなく、遅くなってごめんなさい)

 

当面の目標: 基板上のLEDを点滅させる

 

 目標に向かってまったりやります。

ここで、改めてArduino IDEを立ち上げます。

f:id:soraken:20140817123701p:plain

ちょっと画面サイズ変えました。

これから何をすれば、LEDを点滅させるプログラムが書けるのか、さっぱり。なので、ちょっとIDEをいぢってみます。メニューバーの「ツール」のところに、「マイコンボード」というのがあったので、これを開いてみると、

f:id:soraken:20140817123902p:plain

どうやらターゲットになるボードの選択をするようになっているみたい。確か、8pinoのWebsiteに、8pinoはAdafroitのTrinket 8MHzと互換と書いてあったので、それを選んでみます。まぁ、これだけではIDE自体に何も変化がないようです。

 

他に何か使えそうなものはないかなとIDEのメニューを探していると、ファイルメニューの中に、「スケッチの例」というのがあって、その中を見てみると、「01.Basics」→「Blink」というのがありました。

f:id:soraken:20140817124340p:plain

ほう、これは使えそうだなぁ。ということで、早速選択してみると、こんな感じのウィンドウが開きます。

f:id:soraken:20140817124818p:plain

このサンプルコードを見ると、まず最初にLEDのPin番号を指定しています。LEDを点ける端子番号ですが、8pinoだと確か出力端子が4つしかなかった気が。つまり、このサンプルコードは8pino(少なくともTrinket 8MHz)用に作成されてはいないということですね。

 

サンプルコード全体を見渡してみて、まず、C言語と似ていると感じます。ただ、C言語でありがちな"main"関数ってないんですね。代わりに、"setup"関数と"loop"関数があるようです。この2つ以外にこの2つの関数を呼び出しているところがないので、おそらくこの2つは8pinoにアップロードすると、(リセット後に)自動的に動作するものだろうと思います。(よくわからないので、ということにしておこう)

 

コード自体は詳しく知らなくても何となくわかる感じでいいですね。setup関数内で、出力端子の設定をやっているようですし、loop関数は名前からして実際の動作(Sequence)を書いておく場所だろうと思います。実際、"digitalWrite"と"delay"の2つの関数で、間隔を置いて出力ピンをOn/Offしているように見えます。loop関数内にwhile、forなどのループを示すようなコードがないので、おそらくloop関数自体が繰り返されるのだと思います。

 

特に怪しい(というか訳の分からない)コードはなさそうなので、またまた乱暴にこのまま使って、これを8pinoにアップロードしたいと思います。ただし、先程も書いたように、8pinoにはpin13なんてありません。一方、8pinoの回路図を見ると、GPIO#1に基板上のLEDがつながっている事がわかりましたので、これを使うことにしたいと思います。先程のコードを1カ所だけ書き換えて、

 int led = 1;

ってして、コンパイルしてみましょう。

Arduino IDEのメニューから「スケッチ」→「検証・コンパイル」を選択してみました。すると、思惑通り、コンパイルが始まって、うまくコンパイルができたみたいです。

f:id:soraken:20140817142741p:plain

 では、このまませっかくですので、書き込んでしまいましょう。

ここで8pinoをUSBケーブルでMacに接続します。8pinoは接続してすぐがリセット状態になるらしく、その状態だとボード上の赤色LEDがゆっくり点滅しています。この状態なら書き込めそうだと思ったので、Blinkのウィンドウの左上にある「→」ボタンを押してみると、下のログメッセージにいろいろと表示されて、何となく書き込み作業が行われているように見えます。

が、、、。

メッセージをよく見ると、無茶苦茶errorが発生しています。

f:id:soraken:20141004235609p:plain

ふむ。何か設定が悪いのかしら。。。IDEについてほとんど調べもせずにいきなり書き込もうとしたのが無謀だったようです。

 

Arduino IDEのメニューを見てみると「ツール」というところがこんな感じになってます。

 

ほうほう。先程設定した「マイコンボード」の他に、「シリアルポート」、「書込装置」なども選択するようになっていますよ。まぁ、確かに、書込み手段やデバイスの設定等があってもおかしくないですね、っていうか普通はありますよね。

 

ところで、ここでふと思いました。「あれ、USB経由で書き込むってことは、何かデバイスドライバみたいな物を選択したりとかないのかな?」そういう目で「ツール」→「シリアルポート」を選択してみると、「/dev/ttyほにゃらら」みたいなリストが出てきます。これって、、、、Macのデバイスマウントみたいね、、、、」

ってことは、8pinoをMacに接続する時に使用されるなにかのデバイスがあるべきですね。これを見る方法は、と。。。ネットをググってみてわかりました。Mac標準で使える「ターミナル」を起動して、「ls /dev/tty*」とコマンドを実行してみます。

f:id:soraken:20141006225500p:plain

こんな感じで、デバイスのリストが表示されます。ネットによると、「/dev/usb〜」とかいうのが8pinoになりそうなんですけど、残念ながら見つかりません。

 

ここまでの方法を、Macのポートを変えたり、途中にUSB2.0 Hubを挟んだりして試してみましたが、結局だめ。

 

う〜ん、Mac Proだとこの辺がうまく接続されないのかなぁ。謎ですが、一度、ここでMacは諦めて、Windowsでやってみることにしました。

 

改めて、AdafruitのサイトからArduino IDE(ただし今度はWindowsバージョン)をダウンロードし、ついでにWindows特有のデバイスドライバもダウンロードしてインストールしてみました。この辺の事はAdafruitのサイトに書いてあったので、特につまずく事なく進めました。

 

で、先程と同じように、Arduino IDEでBlinkサンプルプログラムを作成して、8pinoを(USB2.0 Hubを介して)接続して、書き込むと、、、、。成功!! 

f:id:soraken:20141007225624p:plain

調子に乗って、"SOS"のモールス信号で光らせてみました。(上の図のプログラムにはオシロにトリガをかけるためにGPIO#2を使ったりしてますが、基本的にはBlinkとほぼ同等です。)

f:id:soraken:20141007231629p:plain

 という訳で、「Macで」という点ではまだ課題が残りましたが、とりあえず、当初の目的通り、「LEDを点滅させる」まではできました。一息です。

 

 

 

 

8pino - Arduino 事始め

 品モノラボに参加するまで、恥ずかしながらArduinoについては全く知識がありませんでした。Arm系のマイコンとか、仕事でちょこっといじったり、mbedをいじったりはしてましたが、Arduinoはなんとなく敷居が高く、「便利なんだろうーなー」くらいに思ってました。

 8月8日の品モノラボで、8pinoなるものが発売になると聞き、その場で「なんだかよくわかんないけど欲しい!」と思ったのが最初です。運良く、その場で最初のユーザとなることができたので、せっかくだからこの場を利用して、初心者の実験経過を記録しておこうかなと思います。

 

 まず、8pinoですが、こんなおしゃれなパッケージに入ってます。

f:id:soraken:20140815225627p:plain

「センスいいなぁ」という感じです。

中身は、以下のような感じ。

f:id:soraken:20140815230039p:plain

おしゃれなインストラクションと本体。とにかく、本体が小さいのがすごいです。

 

さて、入手したはいいけど、これからどうする?

右も左もよくわからない状態ですので、まずは目標を決めたいと思います。

 

当面の目標「出力端子にLEDをつけて点滅させる」

 

最初は、とにかくどんな感じで動かせばいいかわからないので、幸い、手元にmicro USBケーブルがありましたので、乱暴にもわけのわからないままでmicro USBケーブルでつないでみます。

f:id:soraken:20140815233006p:plain

当たり前と言えばそれまでですが、何も起きないですね。う〜ん、これはちょっと下調べをしてからの方がいいような・・・。

 

という訳で、8pinoの開発元である、VITROさんのWebを観てみますと、こんなのありました。(http://8pino.cc/f:id:soraken:20140815233332p:plain

 ふむふむ。ここを読むと、WindowsではUSBドライバのインストールが必要だけど、Macなら必要なしと。僕の環境はMac(Marverick)だから、この部分は無視してよさそうだ。それから、Trinketなるもの用のArduino IDEをインストールすると書いてある。親切に、「Mac Arduino 1.0.5 for Trinket (also for 8pino)」があるので、そこをクリックしてみた。

f:id:soraken:20140815235124p:plain

すると、Adafruit Arduino 1.0.5.appがダウンロードされました。これをクリックしてみると、こんな感じで、Java SE 6ランタイムをインストールするように言ってきます。

f:id:soraken:20140815235542p:plain

大人しく「インストール」ボタンを押して指示に従ってみます。無事にインストールが終わり、さて、問題のAdafruit Arduinoってのはどうなったかなと思っていると、以下のような画面がポップアップしてきました。なぬ!

f:id:soraken:20140815235917p:plain

 このままではどうしようもないので、一旦、「ゴミ箱に入れる」を選択して、ダウンロードしたアプリを消去。

もう一度、8pinoのWebsiteを良く見ると、Adafruitのサイトへのリンクがありました。(Trinket instruction)

f:id:soraken:20140816112117p:plain

これをクリックすると、以下のようにAdafruitのサイトが表示されます。

f:id:soraken:20140816112344p:plain

 左側のメニューから「Setting up with Arduino IDE」を選択すると、「The Fast Way」という記事がありました。ここを良く読むと、Mac OS X Mavericksの場合、なんだかロックを外せという話が載ってます。

f:id:soraken:20140816133243p:plain

 

これを読んで、自分なりの解釈で、以下の事をやってみました。

1)「システム環境設定」から「セキュリティとプライバシー」を選択

2)「一般」タブを選択して、「ダウンロードしたアプリケーションの実行許可」を

「すべてのアプリケーションを許可」します。(この時、先に左下の鍵マークをクリックして、環境設定を変えるためにパスワードを入力します。)

3)この状態で、もう一度、上記のAdafruitサイトから、「Mac Arduino IDE v1.05 w/Trinket, Gemma, Flora」をクリックして、IDEをダウンロードします。

4)ダウンロードしたファイルを適当なところに移動させて、ここでIDEを起動してみました。

5)動いた!

6)先程変更したシステム環境設定を「Mac App Storeからのアプリケーションのみを許可」に戻して、 左下の鍵マークをクリックして元に戻しておきます。

 

これで、Arduino IDE for Trinketが無事にインストールできました。

 

f:id:soraken:20140816133321p:plain

とりあえず、今日はここまで。