スタディーノミニはスタディーノの半分ほどの大きさです。右がStuduino,左がminiです。
必要最小限の装備になっています。モータ拡張基板(450円)を使ってモータを駆動します。
アーテックの取扱説明書はとても良くできています。読むと勉強になりますので,ぜひダウンロードしてみましょう。
1620円
起動後パソコンにミニをUSBコードで接続して,メニューの設定から基板の選択をクリックします。
Studuino miniを選択します。
次にメニューの実行をクリックして新しい窓の「テストモードを開始」を選択します(マウスでクリックします)。
入出力の設定をするには
①編集のタグをクリックして
②プルダウンから入出力設定をクリックします。
チェック表のチェックを調整します。
起動したときは内蔵のLED3つが使えるようになっています。
AVRのデータシートによると,
Write/Erase Cycles: 10,000 Flash/100,000 EEPROM
Flashはスケッチを書き込むメモリです。EEPROMは電気的書き込み消去可能メモリでデータなどを格納するメモリです。
スケッチを書き込むFlash ROMは10000回書き換え可能ということは1日100回スケッチを書き直して100日使えるということですから結構長持ちするようです。
しかし,勉強したての頃はちょっとしたミスが多くありますので,1日100回の書き直しで済まないかもしれません。
そこでテストモードを使います。Flash ROMに直接書き込まないでRAMに記憶させて何回書き直しても消耗しないようにできます。
実行のタグをクリックしてプルダウンのテストモードを選択します。
ミニのリセットボタンを押すように要求されます。
赤い丸の中のリセットボタンを押してしばらく待ちます。
右側の領域に"センサーボード"が表示されます。
これで安心してプログラミングの練習ができます。
miniのpin内蔵光センサ
A6pin 内蔵光センサ(フォトTR)
A7pin 電池電圧
miniのpin内蔵LED
5pin 内蔵LED赤
6pin 内蔵LED黄色
9pin 内蔵LED緑
出力ON,OFF
赤い四角が内蔵LED GYR(緑黄赤)
赤い丸が内蔵光センサ(フォトTR)です。
(Photo TRansistor ⇒ PTR)
最初はこれです。基板上の赤いLEDを3秒点灯して,その後消灯します。
miniは基板上に緑,黄,赤の3つのLEDが内蔵されていますので,すぐにプログラムの学習ができます。
do{
基板上の赤ON
1秒待ち
基板上の赤OFF
1秒待ち
}
ずっと繰り返すスケッチです。
「ずっと」という制御のスケッチの中に
「チカ」のスケッチをはさみます。
右にArduino言語のスケッチ「do文」を書いておきます。
次のプログラムです。
スクラッチプログラムの練習です。赤,黄,緑のLEDを点滅させます。
光センサも内蔵なので少し上級のプログラムも練習できます。
光が強いと黄色のLED,暗いと緑色のLED,普通は赤色のLEDが光るようにするプログラムです。
IF文
If cold then move.
「寒ければ動きなさい。」
という意味の英語です。
「寒ければ」の替わりに
「光センサが25以下の時」にして,
[動きなさい」の替わりに
「緑ON,1秒待つ,緑OFF」にしたのが下です。
If cold then move else if hot then stop.
「寒ければ動きなさい,そうでなければ
暑ければとまりなさい。」
のようにelse(他に)で更に違う出来事をつなぎ合わせることができます。
if( ){ }
else if( ){ }
else{ }
空白の中に計算や命令が入ります。
Arduino言語のif文です。
何かを比べて条件によって異なる作業を行う,
if文です。
miniだけでちょっと難しいプログラムの学習もできます。
明るさを見て
25より暗ければ緑を点滅させます。
そうでなければ
50より明るければ黄色を点滅させます。
そうでなければ赤色を点滅させます。
ネスティングが入る少し上級の命令です。
program言語ではthenは省力されていることが多いです。
コネクタ
サーボモータ用のコネクタはサーボモータをつなぐ他にモータドライブを付けることができます。
多目的コネクタはセンサやLEDなど色々なものをつなぐことができます。Studuinoのセンサ等も使えます。
スタディーノ miniに接続できる部品?にプログラムカラフルクロックが有ります。
バックライトの色を変えたりメロディを流したり,アラームをプログラムで変更したりすることができます。
プログラムカラフルクロックの組み立て方と注意です。
アクリルカバー
アクリル板とボルト・ナットのセットが400円ほどで販売されています。
30mmと50mmのボルトが2本づつと,ナットが14個,端止め用ナット4個のセットです。
これがないとクロックは自立しません。
セリアの透明なふた付き箱がぴったりの大きさです。
クロックのスケッチ
組み立て終わったらプログラムをしてみましょう。
①編集のタグをクリック
②入出力の設定をクリック
③チェックをすべて外すをクリックして
チェックをすべて外します。
④液晶時計を使用にチェックを入れます。
OKで終了します。
使える命令
時刻合わせや日付,アラーム,バックライト,ブザーの命令ができます・
日時の設定
日時の設定ができます。各部署をクリックすると数字の変更ができます・
実行すると5分後にアラームが鳴る設定になります。
アラームを鳴らすためには「調べる」の工程と処理が必要です。
取り込める数値
時刻やアラームの数値を入力することができます。
「アラームの時刻になったらブザーを1秒鳴らして1秒待つ」を実行します。アラームの時刻は1分間続きますので30回ブザーが鳴ることになります。
難点はminiに接続して動作させると電池では数日しか持たないことです。100円ショップの単3充電池で6日は動作していましたが7日目に表示が消えました。
miniはUSBコードを外すとSleepモードに入ってしまうようです。USBコードを再接続すると復帰しますが,その時時刻をResetしてしまいます。これも困ってしまいます。
2017/10/29
単体でどの位動作するか実験してみます。メス・オスのジャンパワイヤを使ってVCCとGNDに電池を繋ぎました。午後6時です。
30秒遅れで始めました。
2017/11/25
27日目午後5時04分動作中です。26秒遅れです。
2018/1/17
83日目午後9時19分動作中です。
1ケ月5秒=1年1分の誤差ですからかなりの性能と言えます。
電池駆動で1ケ月以上持てば実用になりそうです。
miniはポートを使用していないのでシリアル通信ができません。時刻合わせをプログラムでできるのですが,パソコンからリアルたムで行えません。
何か方法が有ると思います。実際にテストモードでは光センサの値をパソコンに送り,パソコンはプログラムをminiに送っています。artecに問い合わせしたいと思います。2017/10/24
早速回答をいただきました。V-USBを使ってプログラムを作ると通信できるそうです。かなり難しいということですが,頑張りたいと思います。
スタディーノでプログラムカラフルクロックが操作できるといいのですが。mini専用なのでStuduinoでは操作できないという回答をいただきました。
V-USBの説明はとても難しく,使えるようになる自信は出てきません。
miniのハードウエア資料を見ていたところシリアルポートの端子が有りそうに見えました。30,31がRX,TXになっています。基盤を見ると赤丸の所に拡張用のホールが有りました。
L字の端子を付けました。横にするとジャンパコードが接続しやすいと思いました。
Studuino mini拡張
L字の端子を付けました。横にするとジャンパコードが接続しやすいです。
USB5VとGNDも端子を出しておくと便利です。
USBシリアル変換機
USBをTTLシリアルに変換する基板です。100円から200円で買うことができます。
Studuino mini拡張
miniで拡張した端子にUSB TO TTLをジャンパ線で接続します。
書き込みはmini搭載のUSBハイドで行いますので両方USBにつなぎます。
USB2本接続
2本のUSBをつなぐと電源がけんかしてしまいそうですが,元が同じなので大丈夫そうです。ただし拡張したpinのvccは3.3V仕様なのでUSB5Vに繋ぐとすごく明るくLEDが点灯します。壊れてしまう可能性もあります。
これでシリアル通信とプログラム転送の両方を実行できます。時刻合わせの命令も受け付けてくれました。
PCから制御するためにはPC側のプログラムも作る必要があります。少々時間がかかりそうです。
電池駆動
PC(プログラムカラフル)クロックのコネクタVCCのpinを横に折ります。
リード線を付けて電池の(+)につなぎます。
全体像
元のUSBはプログラムの書き込みに使います。新しくシリアル通信のUSBが付くので2つ付けられるUSBコネクタを使います。USBのVCCのコネクタも付けシリアルのデータ転送時も単独でminiを動作させることができるようにしました。
更にGND端子も付けて電池も付けるとUSBを外しても電池で時計を保持してくれます。
USB5VとGND
左がUSB5Vです。シルクもあるのですぐにわかると思います。
右の小さい赤丸がGNDです。少し見つけにくいのですがサーボモータ用コネクタと多目的コネクタの間に有ります。
PCクロックのVCCとminiに付けたGNDを電池に接続します。
USB2TTLの5V端子をUSB5Vに接続します。配線は完了です。
クロック用命令
スクラッチでは命令を選んでドラッグ&コピーでスケッチを作りましたが,Arduino I.D.E.では使える命令を見つけて書いてスケッチを作ります。クロック用の命令を自分で見やすいように表にしてみました。
時計との通信のためのコマンドを設定
取りあえずこれだけのコマンドを設定します。先頭が8の時は2番目のデータが有る合図です。
VBプログラム
VBのフォームです。時計機能はパソコンの内部時計を使っています。タイマー機能を使って100m秒ごとに表示を更新しています。
'timer作動時
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim csW As String
Dim dtNow As DateTime = DateeTime.Now
TextBox21.Text = dtNow.Year
TextBox26.Text = dtNow.Year - 1988
TextBox20.Text = dtNow.Month
TextBox19.Text = dtNow.Day
TextBox1.Text = dtNow.Hour
TextBox2.Text = dtNow.Minute
TextBox3.Text = dtNow.Second
End Sub
VBは時計機能が簡単に実現できます。ツールの中のTimerをドラッグしてForm1の中に置くとFormの下にTimer1が表示されます。
Timer1をクリックするとプロパティが表示されます。ここで間隔を決めることができます。
Timer1をダブルクリックするとコードが表示されますのでプログラムを書くことができます。
Arduinoのswitch文
Arduinoのswitch文は何か制限が有るようです。caseの個数は20を超えることができるのですがswtch文の行数は30行ほどのようです。いつかゆっくり検証してみたいと思います。
今回はif文でスケッチを書くことにします。
データの流れ
PCから時刻を合わせることを要請
PC 8FFFを送信
時計 8FFFを受信
8FFFを送信
PC 8FFFを受信
時刻の時を送信
時計 時刻の時を受信
時計の分を取得
時刻の時,分をセット
時計の時刻を合わせる。
このようなやり取りをStuduino miniとVBで実現させていきます。
Studuino miniのスケッチ
clock003
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
180
181
182
183
184
#include <Clock.h>
#include <Studuino.h>//Studuinoを使う
//宣言
StuduinoMini board;//miniを使う
void setup() {
Serial.begin(9600);
board.InitClock();//Clockの初期化
}
void loop() {
unsigned long hex=0;//16進数を記憶する変数
if (Serial.available() > 0) { // データが存在するか?
hex=SerialReadHex();
SerialSend(hex);
}
if(board.isAlarmTime()){
board.clockBuzzer(BZR_C5,100);
Serial.print("FF00");
}
}
//関数サブルーチン
void SerialSend(unsigned long a){//コマンドに合わせて時計データ送信
if(a== 0xFFFF){//時刻
Serial.print("FFFF");
SerialSend2keta(board.GetHour());
SerialSend2keta(board.GetMinute());
}
if(a== 0xFFFD){//アラーム
Serial.print("FFFD");
SerialSend2keta(board.GetAlarmHour());
SerialSend2keta(board.GetAlarmMinute());
}//ALARM_FNCT_ENABLE 0x20
if(a== 0xFFFB){//年
Serial.print("FFFB");
Serial.print(board.GetYear());
}
if(a== 0xFFFA){//月
Serial.print("FFFA");
SerialSend2keta(board.GetMonth());
}
if(a== 0xFFF9){//日
Serial.print("FFF9");
SerialSend2keta(board.GetDay());
}
if(a== 0xFFF8){//温度
int t=board.GetTemperature();
Serial.print("FFF8");
SerialSend2keta(t);
}
if(a== 0xFFF7){//照度
int r=board.GetOnboardLightSensor();
Serial.print("FFF7");
SerialSend2keta(r);
}
if(a== 0xFFF6){//電圧
int v=board.GetBatteryVoltage();
Serial.print("FFF6");
SerialSend2keta(v);
}
if (a== 0x8FFF){//時設定
Serial.print("8FFF");
int h=SerialReadDec();
int m=board.GetMinute();
board.setTime(h,m);
}
if(a== 0x8FFE){//分設定
Serial.print("8FFE");
int m=SerialReadDec();
int h=board.GetHour();
board.setTime(h,m);
}
if(a== 0x8FFD){//アラーム時設定
Serial.print("8FFD");
int ah=SerialReadDec();
int am=board.GetAlarmMinute();
board.setAlarm(ah,am);
}
if(a== 0x8FFC){//アラーム分設定
Serial.print("8FFC");
int ah=board.GetAlarmHour();
int am=SerialReadDec();
board.setAlarm(ah,am);
}
if(a== 0x8FFB){//年設定
Serial.print("8FFB");
int y=SerialReadDec();
int m=board.GetMonth();
int d=board.GetDay();
board.setDate(y,m,d);
}
if(a== 0x8FFA){//月設定
Serial.print("8FFA");
int y=board.GetYear();
int m=SerialReadDec();
int d=board.GetDay();
board.setDate(y,m,d);
}
if(a== 0x8FF9){//日設定
Serial.print("8FF9");
int y=board.GetYear();
int m=board.GetMonth();
int d=SerialReadDec();
board.setDate(y,m,d);
}
if(a== 0x8FF0){//init
board.InitClock();
delay(1000);
Serial.print("Awawaw");
}
}
unsigned long SerialReadHex(){
unsigned long keta=1;//桁を記憶する変数
unsigned long hex=0;//16進数を記憶する変数
int str=0;//入力を記憶する変数
if (Serial.available() > 0) { // データが存在するか?
delay(50);//バッファの充足を待つ
int sav=Serial.available();
str=0;keta=1;hex=0;
for(int i=0;i<sav-2;i++){//桁を決める
keta=keta*16;}
for(int i=0;i<sav;i++){
if(Serial.available() > 0) { //存在すれば
str =Serial.read(); // 読み込む
if(47<str){//文字ならば
if(str<58){//数字ならば
str=str-48;}//数にする
if(64<str && str<71){//A~Fならば
str=str-55;}//数にする
if(96<str && str<119){//a~fならば
str=str-87;}//数にする
if(0<=str && str<16){//0~fならば
hex=hex+str*keta;keta=keta/16;}//16進数にする
}
}
}
}
return hex;
}
unsigned long SerialReadDec(){
unsigned long keta=1;//桁を記憶する変数
unsigned long dec=0;//10進数を記憶する変数
int str=0;//入力を記憶する変数
while(Serial.available()==0){}
if (Serial.available() > 0) { // データが存在するか?
delay(50);//バッファの充足を待つ
int sav=Serial.available();
str=0;keta=1;dec=0;
for(int i=0;i<sav-2;i++){//桁を決める
keta=keta*10;
}
for(int i=0;i<sav;i++){
if(Serial.available() > 0) { //存在すれば
str =Serial.read(); // 読み込む
if(47<str && str<58){//数字ならば
str=str-48;}//数にする
dec=dec+str*keta;keta=keta/10;//桁を揃える
}
}
}
return dec;
}
int SerialSend2keta(int a){//3桁にして送信
if(a<10){
Serial.print("0");
Serial.print(a);
}
else{
Serial.print(a);
}
}
Arduinoのプログラムです。⇒
取りあえず動くだけです。
miniではこの容量が限界です13868Bytes使い96%になりました。
VBのプログラムです。⇒
取りあえず動くだけです。
ケースに収めました
100円ショップのケースに入れました。余分な配線はケース内に収めたいのですが,今はできていません。
電池ボックス
裏側に電池ボックスをネジ付けました。ねじは皿型でないと電池が浮いてしまいます。
コードの出口はドリルとやすりで作りました。電源用にもう一つあける予定です。
アラーム
残念なことにPCクロック単独(VCCだけ)で動作させてアラームをセットしても指定の時間になりません。
miso,moshi,sckがつながっているせいで何かの影響が有るのかもしれません。
Studuino miniを外してみました。アラームは鳴ります。これを何とかコントロールできないものでしょうか?