top of page
ミニ

 スタディーノミニはスタディーノの半分ほどの大きさです。右が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 内蔵入出力

miniのpin内蔵光センサ

​A6pin 内蔵光センサ(フォトTR)

​A7pin 電池電圧

miniのpin内蔵LED

​5pin 内蔵LED赤

6pin 内蔵LED黄色

9pin 内蔵LED緑

​出力ON,OFF

 赤い四角が内蔵LED GYR(緑黄赤)

 赤い丸が内蔵光センサ(フォトTR)です。

(Photo  TRansistor ⇒ PTR)

プログラムの練習
mini_Lチカ

 最初はこれです。基板上の赤いLEDを3秒点灯して,その後消灯します。

​ miniは基板上に緑,黄,赤の3つのLEDが内蔵されていますので,すぐにプログラムの学習ができます。

do{

 基板上の赤ON

​ 1秒待ち

 基板上の赤OFF

​ 1秒待ち

​}

​ ずっと繰り返すスケッチです。

 「ずっと」という制御のスケッチの中に

 「チカ」のスケッチをはさみます。

​ 右にArduino言語のスケッチ「do文」を書いておきます。

少し難しい

 次のプログラムです。

 スクラッチプログラムの練習です。赤,黄,緑のLEDを点滅させます。

難しいプログラム

 光センサも内蔵なので少し上級のプログラムも練習できます。

 光が強いと黄色のLED,暗いと緑色のLED,普通は赤色のLEDが光るようにするプログラムです。

 IF文 

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のセンサ等も使えます。

アンカー 1

 スタディーノ miniに接続できる部品?にプログラムカラフルクロックが有ります。

​ バックライトの色を変えたりメロディを流したり,アラームをプログラムで変更したりすることができます。

 プログラムカラフルクロックの組み立て方と注意です。

 アクリルカバー 

アンカー 2

 アクリル板とボルト・ナットのセットが400円ほどで販売されています。

 30mmと50mmのボルトが2本づつと,ナットが14個,端止め用ナット4個のセットです。

​ これがないとクロックは自立しません。

​ セリアの透明なふた付き箱がぴったりの大きさです。

 クロックのスケッチ 

アンカー 2

 組み立て終わったらプログラムをしてみましょう。

アンカー 2

①編集のタグをクリック

②入出力の設定をクリック

③チェックをすべて外すをクリックして

  チェックをすべて外します。

④液晶時計を使用にチェックを入れます。

​OKで終了します。

 使える命令 

アンカー 2

時刻合わせや日付,アラーム,バックライト,ブザーの命令ができます・

 日時の設定 

アンカー 3

 日時の設定ができます。各部署をクリックすると数字の変更ができます・

 実行すると5分後にアラームが鳴る設定になります。

​ アラームを鳴らすためには「調べる」の工程と処理が必要です。

​ 取り込める数値 

アンカー 3

 時刻やアラームの数値を入力することができます。

 「アラームの時刻になったらブザーを1秒鳴らして1秒待つ」を実行します。アラームの時刻は1分間続きますので30回ブザーが鳴ることになります。

アンカー 3

 難点はminiに接続して動作させると電池では数日しか持たないことです。100円ショップの単3充電池で6日は動作していましたが7日目に表示が消えました。

 miniはUSBコードを外すとSleepモードに入ってしまうようです。USBコードを再接続すると復帰しますが,その時時刻をResetしてしまいます。これも困ってしまいます。

アンカー 3

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拡張 

アンカー 4

 L字の端子を付けました。横にするとジャンパコードが接続しやすいです。

 USB5VとGNDも端子を出しておくと便利です。

 USBシリアル変換機

アンカー 4

 USBをTTLシリアルに変換する基板です。100円から200円で買うことができます。

 Studuino mini拡張 

アンカー 4

 miniで拡張した端子にUSB TO TTLをジャンパ線で接続します。

​ 書き込みはmini搭載のUSBハイドで行いますので両方USBにつなぎます。

 USB2本接続​ 

アンカー 4

 2本のUSBをつなぐと電源がけんかしてしまいそうですが,元が同じなので大丈夫そうです。ただし拡張したpinのvccは3.3V仕様なのでUSB5Vに繋ぐとすごく明るくLEDが点灯します。壊れてしまう可能性もあります。

 これでシリアル通信とプログラム転送の両方を実行できます。時刻合わせの命令も受け付けてくれました。

​ PCから制御するためにはPC側のプログラムも作る必要があります。少々時間がかかりそうです。

アンカー 4

 電池駆動 

 PC(プログラムカラフル)クロックのコネクタVCCのpinを横に折ります。

 リード線を付けて電池の(+)につなぎます。

アンカー 5

 全体像 

 元のUSBはプログラムの書き込みに使います。新しくシリアル通信のUSBが付くので2つ付けられるUSBコネクタを使います。USBのVCCのコネクタも付けシリアルのデータ転送時も単独でminiを動作させることができるようにしました。

 更にGND端子も付けて電池も付けるとUSBを外しても電池で時計を保持してくれます。

 USB5VとGND 

アンカー 5

 左がUSB5Vです。シルクもあるのですぐにわかると思います。

​ 右の小さい赤丸がGNDです。少し見つけにくいのですがサーボモータ用コネクタと多目的コネクタの間に有ります。

 PCクロックのVCCとminiに付けたGNDを電池に接続します。

 USB2TTLの5V端子をUSB5Vに接続します。配線は完了です。

 クロック用命令 

アンカー 5

 スクラッチでは命令を選んでドラッグ&コピーでスケッチを作りましたが,Arduino I.D.E.では使える命令を見つけて書いてスケッチを作ります。クロック用の命令を自分で見やすいように表にしてみました。

 時計との通信のためのコマンドを設定 

 取りあえずこれだけのコマンドを設定します。先頭が8の時は2番目のデータが有る合図です。

 VBプログラム 

アンカー 5

 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をダブルクリックするとコードが表示されますのでプログラムを書くことができます。

アンカー 5

 Arduinoのswitch文 

 Arduinoのswitch文は何か制限が有るようです。caseの個数は20を超えることができるのですがswtch文の行数は30行ほどのようです。いつかゆっくり検証してみたいと思います。

 今回はif文でスケッチを書くことにします。

 データの流れ 

PCから時刻を合わせることを要請

PC      8FFFを送信

時計    8FFFを受信

          8FFFを送信

PC      8FFFを受信

          時刻の時を送信

時計    時刻の時を受信

           時計の分を取得

          時刻の時,分をセット

​時計の時刻を合わせる。

アンカー 5

 このようなやり取りを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のプログラムです。⇒

​取りあえず動くだけです。

アンカー 6

 miniではこの容量が限界です13868Bytes使い96%になりました。

VBのプログラムです。⇒

​取りあえず動くだけです。

 ケースに収めました 

 100円ショップのケースに入れました。余分な配線はケース内に収めたいのですが,今はできていません。

アンカー 6

 電池ボックス 

 裏側に電池ボックスをネジ付けました。ねじは皿型でないと電池が浮いてしまいます。

 コードの出口はドリルとやすりで作りました。電源用にもう一つあける予定です。

 アラーム 

アンカー 6

 残念なことにPCクロック単独(VCCだけ)で動作させてアラームをセットしても指定の時間になりません。

​ miso,moshi,sckがつながっているせいで何かの影響が有るのかもしれません。

​ Studuino miniを外してみました。アラームは鳴ります。これを何とかコントロールできないものでしょうか?

bottom of page