RaspberryPi15Jamのブログ

IoTで作ったもの、ハマったことの備忘録

「親子で参加 プログラミング体験」へ行ってみた

1.「親子で参加 プログラミング体験」の概要

10月某日、下の子と2人で行ってきました。
小学3・4年生と親の2人1組で参加する講座で、見た感じ4年生が多くて3年生が少ない印象。
親は父親と母親が半々くらいで、こういう親子参加の講座では珍しく父親の割合が多かったです。子どもの男女比も半々くらいかな?
講師はS〇ftBankの方で、配布資料は宣伝ばかり…講座で使うアプリのダウンロード先とかURLなどのテキスト類は一切無し!という点が自分の中ではマイナスポイントでした
上の子が学校のスマホ教室の講師はD〇comoの方だったと言ってたから、特定のキャリアと癒着しないようにしているのだろうか?
講座の進め方は、子どもにタブレット(iPad)が配布され、それを使って2種類のプログラミングを体験するものでした。
体験を始める前に2020年度から小学校でもプログラミング教育が必修化されたことについて、プログラミング言語を教えるものではなく、あくまで「プログラミング的思考」を身に着けるのが目的という説明がありました。というわけで、この講座でも親は「間違いを指摘して正解を教えないこと」「アドバイスをしよう」「できたら褒めよう」みたいな注意を受けて、プログラミング体験の1つ目へ。

2.Swift Playgrounds コードを学ぼう

まず1つ目の体験は「Swift Playgrounds コードを学ぼう1 Swiftの基本」というアプリを使いました。
Apple社が公式で無償提供しているアプリなので、もちろんiOSのみ対応で学ぶ言語はSwiftです。
一番最初は「バイト」というキャラクターにコマンドで命令してジェムを取る問題。コマンド(関数)が用意されていて、それを順番にならべてコーディングします。こんな感じ↓

moveForward()
moveForward()
moveForward()
collectGem()

小学校で英語も勉強しているとはいえ、関数名が英語で理解できるのか心配したけど、意外とすんなり馴染んでサクサク先の問題へ進んでいきました。最初のコマンドの章が終わって、次の関数の章のチュートリアルを見たところで時間切れに。自分はSwiftでプログラムを書いたことがないので「Swiftやったことないよ~Swiftでプログラミングできるなんてすごいね!」と子供を褒めてみる(笑)
「コードを学ぼう1 Swiftの基本」の次には「コードを学ぼう2 中級」もあり、ここまで来るとオブジェクト指向も学べるようです。オブジェクト指向よりも後で配列が出てくるのが今どきの教える順番なのだろうか?

3.「Hour of Code」のMinecraft

2つ目の体験は「Hour of Code」内のMinecraftアドベンチャーでした。「Hour of Code」プログラミング学習ができる教材(アクティビティ)が多数用意されているインターネットサイト。インターネットサイトなのでOSに制限は無くブラウザさえあれば使えます。無料の物が多いですが、一部、有料の物もあるようです。
コーディングの方法は日本語で書かれたブロックを並べるスタイルです。似たようなScratchでプログラミングしたことがあったので、こちらもすぐに馴染みました。
市の広報誌に載った写真↓
f:id:RaspberryPi15Jam:20201103143829j:plain
調子に乗って難しい問題を選択したら、なかなか正しいプログラムが書けない事態に!ステップ実行が無いので、プログラムを変更して最初から実行を何度も繰り返し間違えた場所を見つけるのが大変でした。
講師の方にステップ実行できないんですか~?って質問しようかと思ったけど、あくまで子どもが主役の講座で自分は付いててきただけの素人というスタンスでやめときました。
ちなみに1つ目の体験で使った「Swift Playgrounds コードを学ぼう」にはステップ実行あるのですが、いわゆるスロー実行という感じで思ってるステップ実行と違った…
せっかく繰り返しを学んだのに使わずに3歩前に進むを上のコードみたいに1歩前に進むを3回書いていたので、「繰り返しを使ってみようか?」とアドバイスしました。でも、心の中では、仕事では、あえて繰り返し使わずにベタ書きすることあるんだよね~と思いつつ…繰り返し文をやめて、あえてベタ書きした件については、またそのうち投稿したいと思います。

4.テキシコー

プログラミング必修化は「プログラミング的思考」を身に着けるのが目的ということで、おすすめなのがEテレのテキシコーという番組です。特にダンドリオンのコーナーがお気に入りです。大人が見ても非常にタメになります! www.nhk.or.jp

Grove IoT スターターキットで作ってみた その2

1.改良?のいきさつ

そもそも、その1で「電話してね」ボタンを作ったのは
留守番中の子どもからの連絡用のため。
コロナウイルスの緊急事態宣言で休校中、基本、在宅勤務となったものの、どうしても出社せねばならぬ日もあるのがサラリーマンの辛いところ…
家の固定電話の使い方を教え、上の子にはデータ通信とSMSのみの格安SIMを入れたスマホでSMSで連絡を取ることに。
連絡手段は多いほうがいいので、「電話してね」ボタンは下の子に渡して出社してました。
学校が再開してからは、帰宅時にSMSで帰ってきたよ連絡を入れる運用にしたが、なかなかSMSが来なくて心配になることも…おやつ食べたり、のんびりしてただけらしい(怒)
というわけで、帰ってきたことが分かるものを作ろう!というわけで、「超音波距離センサで”ただいま”を通知する」よう改造しました。

2.超音波距離センサで”ただいま”を通知する装置の概要

・ボタンを押すとスマホに「電話してね!」のSMSが届く機能は、その1のまま
・給電はモバイルバッテリーからACアダプタヘ変更
・磁気スイッチを外し、代わりに超音波距離センサを接続する
 測定距離が閾値未満になった時に、「人が通過した=帰宅した」ということでスマホにSMSが届く
必ずセンサの前を通過するよう、玄関に設置しました。
f:id:RaspberryPi15Jam:20201101150645j:plain 壁までの距離が140cm、距離が100cm未満を通過判定の閾値にするといい感じ!
ミニトマトが入っていたカップに入れたので、子どもたちから『トマトカップくん』と命名された(笑)
f:id:RaspberryPi15Jam:20201101150203j:plain

3.ソースコード

#include <WioLTEforArduino.h>
#include <Ultrasonic.h>      // https://github.com/Seeed-Studio/Grove_Ultrasonic_Ranger

#define BUTTON_PIN      (WIOLTE_D20)
#define ULTRASONIC_PIN  (WIOLTE_D38)
#define INTERVAL        (100)

#define S_PHONE_NUMBER  "090XXXXXXXX"

int buttonState;    //for pushbutton
long pre_distance = 200;

WioLTE Wio;
Ultrasonic UltrasonicRanger(ULTRASONIC_PIN);

void setup()
{
  delay(200);

  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");

  SerialUSB.println("### I/O Initialize.");
  Wio.Init();

  Wio.PowerSupplyGrove(true);

  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  delay(500);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }
  delay(3000);

  SerialUSB.println("### Setup completed.");
  Wio.LedSetRGB(0, 50, 0);
}

void loop()
{
  long distance;
  distance = UltrasonicRanger.MeasureInCentimeters();
  SerialUSB.print(distance);
  SerialUSB.println("[cm]");

  Wio.LedSetRGB(0, 50, 0);

  if ((pre_distance < 100)&&(distance < 100) )
  {
    SerialUSB.println("### Send SMS.");
    if (!Wio.SendSMS(S_PHONE_NUMBER, "We came back home!?")) {
      SerialUSB.println("### ERROR! ###");
      Wio.LedSetRGB(50, 0, 0);
      delay(1000);
    } else {
      SerialUSB.println("### SMS Send OK.");
      Wio.LedSetRGB(0, 0, 50);
      delay(1000);
    }
  }
  pre_distance = distance;

  buttonState = digitalRead(BUTTON_PIN);
  if (buttonState != 0)
  {
    SerialUSB.println("### Send SMS.");
    if (!Wio.SendSMS(S_PHONE_NUMBER, "This is Name. Please call me!")) {
      SerialUSB.println("### ERROR! ###");
      Wio.LedSetRGB(50, 0, 0);
      delay(1000);
    } else {
      SerialUSB.println("### SMS Send OK.");
      Wio.LedSetRGB(0, 0, 50);
      delay(1000);
    }
  }

  delay(INTERVAL);
}

4.課題

測定距離が閾値未満で即SMSを送信するようにしたら、誰もいないはずの時間にSMSが来るので不安に…
泥棒?霊的なもの?Gが出たのか?というのは半分冗談で、やはり測定値1発読みで判定は良くないので、 2回連続で閾値未満を通過判定としました。
それでも、まだ、1日に2回ほど変な時間にSMSが来るので、ちゃんと原因追及したいと思います。
1日だけTeraTermでログを取ってみたけど、その日は、変な時間にSMSが来る現象は再現せず…
仕込みを入れると現象再現せずってあるあるですよね(笑)再現するまで、ログ取りを続けます。

次回は「作ってみた」ではなく「行ってみた」について書く予定です。

Grove IoT スターターキットで作ってみた その1

1.Grove IoT スターターキットとは?

SORACOMが販売しているマイコンモジュール Wio LTE JP Version と7種類のセンサーのとSIMカードのセットです。
様々なセンサーを使って簡単にIoTで物が作れます。
スターターキットはココで買えます

2.電話してねボタンを作ってみた

  • ボタンを押すとスマホに「電話してね!」のSMSが届く
  • 磁気スイッチをオンすると別のスマホに「電話してね!」SMSが届く f:id:RaspberryPi15Jam:20201010161907j:plain 機能は、ただ、それだけです(汗)

3. 用意したものと、出来上がった物

・Grove IoT スターターキット
・特定地域向け IoT SIM(plan-D データ通信/SMS)
・モバイルバッテリー
を用意しました。
スターターキットに含まれるSIMはデータ通信のみでSMSは使えません。
今回はSMSを使いたかったので追加でSMS対応のSIMを購入しました。
f:id:RaspberryPi15Jam:20201010165529j:plain

4.ソースコード

#include <WioLTEforArduino.h>

#define BUTTON_PIN          (WIOLTE_D20)
#define MAGNETIC_SWITCH_PIN (WIOLTE_D38)

#define M_PHONE_NUMBER  "090XXXXXXXX"
#define S_PHONE_NUMBER  "090xxxxxxxx"

int buttonState;    //for pushbutton
int magSwitchState; //for magnetsiwtch

WioLTE Wio;

void setup() {
  delay(200);

  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");
  
  SerialUSB.println("### I/O Initialize.");
  Wio.Init();

  Wio.PowerSupplyGrove(true);
  
  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  delay(500);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }
  delay(3000);

  SerialUSB.println("### Setup completed.");
  Wio.LedSetRGB(0, 50, 0);
}

void loop() {
    Wio.LedSetRGB(0, 50, 0);    
  
    // read the state of the pushbutton and magnetswitch value :
    buttonState = digitalRead(BUTTON_PIN);
    magSwitchState = digitalRead(MAGNETIC_SWITCH_PIN);

    if(buttonState != 0)
    {
      SerialUSB.println("### Send SMS.");
      if (!Wio.SendSMS(S_PHONE_NUMBER, "This is Name. Please call me!")) {
        SerialUSB.println("### ERROR! ###");
        Wio.LedSetRGB(50, 0, 0);
        delay(1000);
      } else {
        SerialUSB.println("### SMS Send OK.");
        Wio.LedSetRGB(0, 0, 50);
        delay(1000);        
      }
    }

    if(magSwitchState != 0)
    {
      SerialUSB.println("### Send SMS.");
      if (!Wio.SendSMS(M_PHONE_NUMBER, "This is name.\nPlease call me!")) {
        SerialUSB.println("### ERROR! ###");
        Wio.LedSetRGB(50, 0, 0);
        delay(1000);
      } else {
        SerialUSB.println("### SMS Send OK.");
        Wio.LedSetRGB(0, 25, 25);
        delay(1000);        
      }
    }

}

電話番号とメッセージ中の名前は個人情報なので伏せています…

5.スマホにSMSが届きます

f:id:RaspberryPi15Jam:20201010171722j:plain

6.その後

ボタンを押すとスマホに「電話してね!」のSMSが届く機能はそのままにして、
磁気スイッチを外して代わりにスターターキットについてた別のセンサーをつけました。
これについては、次回、書きたいと思います。
他にはGrove IoT スターターキットのセットアップ方法についても書きたいと思います。