What can make micro-maqueen looks better?マイクロマックイーンの見栄えをどうにかしたい

これの見た目どうにかならんのか?

https://www.dfrobot.com/product-1783.html

これを見たら閃いた

発砲どんぶり(お椀)で亀を作る:自由工作

上記リンク先の発泡どんぶりそのままだとデコレーションしづらい(油性ペン使えない)ので以下のアイテムを使うことにした。紙製かつ100円で環境にも優しいらしいので工作にはもってこい。

https://iyec.omni7.jp/detail/4973631533420

これだけだとマックイーンとの接着ができないので以下のアイテムを追加購入。

できたのがこちら

作ってみた感想

紙の土台だと工作もしやすいので良き。例えばサーボモータ乗っけて腕をつけるとかできそうかなと。

ArduinoでRFIDモジュール(MFRC522)を使ってタグに名前の書き込み・読み込みをする

今回使うもの

Aruduino UNO

MFRC522

使用する前のセッティング

以下の記事を参考にしてください。

非接触ICタグで遊ぼう!ArduinoでRFIDリーダRC522を使う方法

とりあえず私はこんなかんじ。無駄にマイクロビット繋げてますけど気にしないでください。

コード

ライブラリのサンプルをそのまま使います。

https://github.com/miguelbalboa/rfid/tree/master/examples

まずは書き込みから。

/*
 * Write personal data of a MIFARE RFID card using a RFID-RC522 reader
 * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT. 
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 *
 * More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
 *
 * Hardware required:
 * Arduino
 * PCD (Proximity Coupling Device): NXP MFRC522 Contactless Reader IC
 * PICC (Proximity Integrated Circuit Card): A card or tag using the ISO 14443A interface, eg Mifare or NTAG203.
 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com. 
 */

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance

void setup() {
  Serial.begin(9600);        // Initialize serial communications with the PC
  SPI.begin();               // Init SPI bus
  mfrc522.PCD_Init();        // Init MFRC522 card
  Serial.println(F("Write personal data on a MIFARE PICC "));
}

void loop() {

  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

  // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  Serial.print(F("Card UID:"));    //Dump UID
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.print(F(" PICC type: "));   // Dump PICC type
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(mfrc522.PICC_GetTypeName(piccType));

  byte buffer[34];
  byte block;
  MFRC522::StatusCode status;
  byte len;

  Serial.setTimeout(20000L) ;     // wait until 20 seconds for input from serial
  // Ask personal data: Family name
  Serial.println(F("Type Family name, ending with #"));
  len = Serial.readBytesUntil('#', (char *) buffer, 30) ; // read family name from serial
  for (byte i = len; i < 30; i++) buffer[i] = ' ';     // pad with spaces

  block = 1;
  //Serial.println(F("Authenticating using key A..."));
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("PCD_Authenticate() success: "));

  // Write block
  status = mfrc522.MIFARE_Write(block, buffer, 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("MIFARE_Write() success: "));

  block = 2;
  //Serial.println(F("Authenticating using key A..."));
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  // Write block
  status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("MIFARE_Write() success: "));

  // Ask personal data: First name
  Serial.println(F("Type First name, ending with #"));
  len = Serial.readBytesUntil('#', (char *) buffer, 20) ; // read first name from serial
  for (byte i = len; i < 20; i++) buffer[i] = ' ';     // pad with spaces

  block = 4;
  //Serial.println(F("Authenticating using key A..."));
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  // Write block
  status = mfrc522.MIFARE_Write(block, buffer, 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("MIFARE_Write() success: "));

  block = 5;
  //Serial.println(F("Authenticating using key A..."));
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  // Write block
  status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("MIFARE_Write() success: "));


  Serial.println(" ");
  mfrc522.PICC_HaltA(); // Halt PICC
  mfrc522.PCD_StopCrypto1();  // Stop encryption on PCD

}

すると以下のような出力がシリアルモニターに表示されます。

Type Family name, ending with #

そしたら入力欄にファーストネーム「hoge#」を打ち込みましょう。入力の最後は#で終わらせる必要があります。すると以下の出力が続きます。

PCD_Authenticate() success:
MIFARE_Write() success:
MIFARE_Write() success:
Type First name, ending with #

最後に「taro#」と打ち込めば完了です。

次に読み込み。

/*
 * Initial Author: ryand1011 (https://github.com/ryand1011)
 *
 * Reads data written by a program such as "rfid_write_personal_data.ino"
 *
 * See: https://github.com/miguelbalboa/rfid/tree/master/examples/rfid_write_personal_data
 *
 * Uses MIFARE RFID card using RFID-RC522 reader
 * Uses MFRC522 - Library
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 *
 * More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*/

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance

//*****************************************************************************************//
void setup() {
  Serial.begin(9600);                                           // Initialize serial communications with the PC
  SPI.begin();                                                  // Init SPI bus
  mfrc522.PCD_Init();                                              // Init MFRC522 card
  Serial.println(F("Read personal data on a MIFARE PICC:"));    //shows in serial that it is ready to read
}

//*****************************************************************************************//
void loop() {

  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

  //some variables we need
  byte block;
  byte len;
  MFRC522::StatusCode status;

  //-------------------------------------------

  // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  Serial.println(F("**Card Detected:**"));

  //-------------------------------------------

  mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid)); //dump some details about the card

  //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));      //uncomment this to see all blocks in hex

  //-------------------------------------------

  Serial.print(F("Name: "));

  byte buffer1[18];

  block = 4;
  len = 18;

  //------------------------------------------- GET FIRST NAME
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(mfrc522.uid)); //line 834 of MFRC522.cpp file
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Authentication failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  status = mfrc522.MIFARE_Read(block, buffer1, &len);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Reading failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  //PRINT FIRST NAME
  for (uint8_t i = 0; i < 16; i++)
  {
    if (buffer1[i] != 32)
    {
      Serial.write(buffer1[i]);
    }
  }
  Serial.print(" ");

  //---------------------------------------- GET LAST NAME

  byte buffer2[18];
  block = 1;

  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 1, &key, &(mfrc522.uid)); //line 834
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Authentication failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  status = mfrc522.MIFARE_Read(block, buffer2, &len);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Reading failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  //PRINT LAST NAME
  for (uint8_t i = 0; i < 16; i++) {
    Serial.write(buffer2[i] );
  }


  //----------------------------------------

  Serial.println(F("\n**End Reading**\n"));

  delay(1000); //change value if you want to read cards faster

  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
}
//*****************************************************************************************//

すると以下が出力されます。

**Card Detected:**
Card UID: xxxx
Card SAK: xxxx
PICC type: MIFARE 1KB
Name:
taro hoge
**End Reading**

注意点

一点はまったポイントがあるので記しておきます。書き込み時に以下のような出力が出る場合があります。

PCD_Authenticatie Failed…

MFRC522では各種操作の前に以下リンク先の205行目にあるPICC_CMD_MF_AUTH_KEY_Aを用いてタグの認証を行います。

https://github.com/miguelbalboa/rfid/blob/master/src/MFRC522.h

上記エラーはこの認証が通らなかったことを意味するのですが、事前の鍵情報の書き込みをしてない限りそれはあり得ません。

ではなぜ起こったのか?それは「書き込みが完了する前にタグをリーダから離してしまった」からです。書き込みが完了するまでは以下のようにしっかりとタグを読み込ませておかないと認証が失敗してしまうので気を付けてください。

Open & Close detection module with microbit and magnetic switch / Microbitと磁気スイッチを使って開閉検知モジュールを作る

やりたいこと

  • マイクロビットにポン付できるお手軽なモジュールを作りたかった
  • 手始めに開閉検知機能を持ったモジュールを量産できたらと

使用機材

マイクロビット v2

https://www.switch-science.com/catalog/6600/

磁気スイッチ

ワニ口クリップ(赤黒黄それぞれ一つずつ)

抵抗器(1kΩ)

回路図

実際に作ったのがこちら

動作確認

プログラム

オーディオ出力先切り替えスイッチを作成

在宅勤務をしていると,スピーカーとヘッドホンを切り替えることがしばしば.

TV会議しているとき以外は蒸れるので,スピーカー.

TV会議はヘッドホン.

ところが,突発でコールが入ると,スピーカーからヘッドホンに切り替えに手間取る手間取る.

というわけで,それ専用のスイッチを, Arduino pro micro を使って作成してみました.

動画内の画面左下あたりに,現在選択されているオーディオデバイスが表示されてますが,赤を押すとスピーカー,青を押すとヘッドホンになります.

準備するもの

  • Arduino pro micro
  • マイクロUSBケーブル
  • ブレッドボード
  • ジャンパワイヤパック
  • タクトスイッチ

作成手順

1. PCにaudioSwitcher をインストール&ホットキーを設定

詳細は https://keikenchi.com/how-to-switch-output-audio-with-shortcut-keys をご参考ください.

とても分かりやすく説明してくださってます.ありがとうございます.

今回は,他のアプリのホットキーと絶対に干渉しないように,「Ctrl+Shift+Alt+s」をスピーカーに,「Ctrl+Shift+Alt+g」をヘッドホンに割り当てました.

2. 回路の組み立て

ブレッドボード上に回路を組み上げていきます.

Arduino Pro Micro の ピンアサイン.

3. Arduino IDE でプログラムを書き込みます.

こちらは,https://qiita.com/MergeCells/items/17bdc1c1fb35949195b5 を参考に書いていきました.

#include "Keyboard.h"

#define RED_button 10
#define BLUE_button 18

void setup() {
  pinMode(RED_button, INPUT_PULLUP);
  pinMode(BLUE_button, INPUT_PULLUP);
  Keyboard.begin();
}

void loop() {
  if(digitalRead(RED_button)==LOW){
   Keyboard.press(KEY_LEFT_ALT);
   Keyboard.press(KEY_LEFT_CTRL);
   Keyboard.press(KEY_LEFT_SHIFT);   
   Keyboard.press('s');
   delay(100);
   Keyboard.releaseAll();
   while(digitalRead(RED_button)==LOW);
  }
  else if(digitalRead(BLUE_button)==LOW){
   Keyboard.press(KEY_LEFT_ALT);
   Keyboard.press(KEY_LEFT_CTRL);
   Keyboard.press(KEY_LEFT_SHIFT);  
   Keyboard.press('g');
   delay(100);
   Keyboard.releaseAll();
   while(digitalRead(BLUE_button)==LOW);
  }
  delay(100);
}

気づき

PC側のソフト設定とArduinoでやれることは他にもありそうな感じ.

あと,開発環境の重要性についても考えさせられました.

はじめは無名の安いブレッドボードを使用していたのですが,「線がうまくささらない,ささったら今度は抜けない」,挙句に「ジャンパワイヤが壊れる」,という事態に見舞われたため,サンハヤト製のものを購入してみ ました.

結果,「もっと早く買っておけばよかった」というくらいイライラが減りました.

いろいろなことを試すうえで,しょーもないところで事故が起きてその対応に迫られると,ものすごくフラストレーションが溜まります.

開発環境をケチってはいけないなぁ,と.

サンハヤト製のブレッドボードとジャンプワイヤパック
粗悪なブレッドボードから無理に引っこ抜いたら先が外れてしまった

Arduino でうまくLチカできない理由

Pro Micro の激安互換品(1980円/3pcs@Amazon) を使ってLチカを試してみました.

が,思ってたとおりに光りませんでした.なんか暗い...

書いたコードは下記の通り.

VCC をチェックすると,約5V出ているので,問題なし.

端子電圧は1.7Vなので,LEDを光らせるだけの電圧は出力されている.

ところが,電流が77μAしか出ていなかった.

本来は10-15mA なので,8000分の1しか電流が出ていない...

「Pro Micro 互換品の仕様なのかな?」とか「これは不良品なのか?」とか
色々と検討すること3時間.

で,3時間考え込んで,分かった原因はすごく初歩的なものでした.

出力側のピンモード設定を
入れ忘れてた!!!

おわり orz

Raspberry Pi インストールからHeadless環境構築まで

やりたいこと

  • Raspberry Pi の OS をインストール
  • セキュリティ強化
  • SSHやVNCで接続できるようにする

1. Raspberry Pi OS インストール

https://www.raspberrypi.com/software/ より Download for Windows をクリックして,ダウンロード.

ダウンロードが完了したら,ファイルを実行する.

OS選択ボタンを押して,RaspberryPi OS(32-bit) を選択

次にストレージ選択ボタンを押して,インストールするSDカードを選択する

最後に,WRITEボタンを押してイメージの書き込みを開始する.

本当にSDカードに書き込んでよいのか聞かれるので, Yes.

ラズベリーパイが焼けるまで待ちます.

書き込むマシンの性能にもよりますが,おおよそ5分程度かかります.

無事に焼きあがっていれば,下記のようなダイアログが出てるので,

ディスクを取り出します.ディスクを取り出すときは,右下の

焼き上がったSDカードをラズパイに差し込みます.

ラズパイにモニターと電源を接続します.

このとき,電源は,2.5A 以上の出力のものを使うこと,

また忘れやすいのですが,ケーブルも2.5A以上の出力用の
(内部抵抗の低い)ものを使いましょう.

私は,800mA の電源を使っていたため,
Wi-Fi(消費電力多め)を使った瞬間に電源が落ち,
無駄に時間を浪費しました.(原因が分からず悩み時間でorz

起動を確認したら,Next を押します.

ロケーションの設定です.時刻や言語の設定になります.

私はUSキーボードしか使わないので,
“Use US Keyboard” にもチェックをいれました.

デフォルトで作成されるユーザアカウント名 pi のパスワードを設定します.

タスクバーの位置について聞かれますが,無視します.Nextで.

WiFiの設定です.繋げたいSSIDを選択し,パスワードを入力します.

ネットに繋がったら,ソフトウェアアップデートをするので,Nextを押します.

最後に再起動します.

2. セキュリティ強化

  • pi ユーザの削除 : デフォルトのアカウントのままだと,パスワードクラックを受けやすくなります
  • オートログインの無効化
  • root のパスワードを設定しておく

の3点を行います.

pi ユーザの削除

pi をただ削除するだけだと,ログインできなくなってしまうので,
新規にアカウントを作成します.ここでは mypi を新ユーザとします.

ターミナルを立ち上げます.

sudo adduser mypi

piと同じ権限をmypiに付与するため,まず pi に与えられた権限を確認.

groups pi

pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio,lpadmin の権限があることが確認できたので,mypiに付与します.

sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev,spi,i2c,gpio,lpadmin mypi (←カンマで区切り,スペースは入れない

pi ユーザのホームディレクトリの中身を mypi へコピー

sudo cp -r /home/pi/* /home/mypi

最後に piユーザでログインできないようにします.
pi のアカウント有効期限を過去のものにするコマンドを使います.

sudo usermod –expiredate 1 pi

再起動して,mypi でログインし直します.

オートログインの無効化

root のパスワードの設定

sudo passwd root

3. SSHやVNCで接続できるようにする

SSHやVNCはネットワークの設定をするため,
PCとラズパイの位置付けで設定内容が変わってしまうのですが,
話をややこしくしないために,まずは同一LAN内にいるとします.

具体的には,下記のような感じです.
PCもラズパイも同じルータからIPアドレスをもらってます.

それではVNCの設定から行っていきます.
VNCは,ラズパイのGUI をLAN内から制御できる仕組みです.
リモートデスクトップとも呼ばれます.

インターフェース → VNC, SSHの有効化します.
SSH はCUIベースのリモート接続ツールです.
後ほどSSH でも接続できるようにするので,有効化しておきましょう.

デスクトップ右上のVNCサーバのアイコンをクリックして
出てくるIPアドレスをメモしておきます.

続いて,PC側に VNC クライアントをインストールします.

https://www.realvnc.com/en/connect/download/viewer/

ダウンロードが完了したら,アプリを立ち上げ,
「New Connection」を選択します.

先ほど,メモしたIPアドレスを入力します.

ダブルクリックで起動します.

ディスプレイをつながなくても,VNCだけで運用できるように,
あらかじめ画面の設定をしておきます.

PC側のモニタの解像度に合わせて,Headless Resolution の値を変更します.
設定変更後,再起動を促されるので,再起動します.

※注:上記画像では1280×720 になってますが,実際は1920×1080にしました.

再起動すると,画面がおかしなことになっていることが確認できます.

ターミナルを開き,sudo vi /boot/config.txt で設定ファイルを編集します.
17, 18行目の先頭の# を外して,以下のように書き換えます.

framebuffer_width=1920
framebuffer_height=1080

また,62 行目をコメントアウトしておきます.

この部分,ネットには,同設定ファイルの 62行目の末尾に
「,nocomposite」を追記するやり方もありますが,
それだと,HDMI接続の場合にディスプレイに映らなくなります.

万が一,VNCが繋がらなくなった場合,
ディスプレイを繋いでのレスキューができないということです.

なので,繰り返しになりますが,62行目はコメントアウトで対応しましょう.

なお,最悪,VNC/HDMI 共に繋がらなくなったら,
microSDをラズパイから抜き,PCに入れて,SDカードドライブから
config.txt をメモ帳などで修正し,再度ラズパイに入れれば,
HDMI接続できるようになります.

上記の設定ファイルの書き換えが終わったら,再起動します.
以上でVNCの設定は終わりです.

次にSSH の設定です.

SSHの接続のやり方には主に2つあり,

  • パスワード認証:id, pass を入力して一致したら認証する
  • 公開鍵認証:クライアント側で,錠前(公開鍵)と鍵(秘密鍵)を用意しておき,あらかじめ錠前をサーバーに渡しておき,その錠前に鍵を使って認証する

デフォルトは,パスワード認証になっているが,セキュリティ的に公開鍵認証に比べて弱いので,公開鍵認証へ変更する.

まずデフォルト状態のパスワード認証で接続できるか,をテストします.

Windows のPowerShell を立ち上げて,ssh mypi@192.168.1.3 と入力.

初回だけ「今までに繋げたとこじゃないけど本当に繋げますか?」と聞かれるので,yes.

パスワードを入力するとログインできることを確認.

exit でログアウトする.

続いてPowerShell内 で公開鍵・秘密鍵を生成します.
.ssh フォルダが自動生成され,その中に入っているid_rsa が秘密鍵,
id_rsa.pub が公開鍵,です.
PS C : users > ssh-keygen 
-t 
rsa 
eneratina vate rsa kev Dai r 
096 
‘Enter file in which to save the kev (c: users . ss rsa . 
Enter passphrase (empty tor no passphrase) : 
Enter. same oassohrase aaain• 
our Identifi cation has been save nn c: .ssh/id_rsa. 
our public key has been saved in c: 
he key fingerprint is: 
SHA256:- 
he key’s ranQ)tnart image is: 
[RSA 4096]—-+ 
ps C. 
rsy9LAPTOP-FZE+F4F.; “><br> <br>ssh-keygen コマンドで RSA暗号(公開鍵と秘密鍵の生成ロジック)を指定すると,デフォルトで3072bit の暗号強度となります.<br>-b 4096 と指定することで,4096bit へ変更できます.<br><br>ssh-keygen -lf id_rsa で出来あがった鍵の素性を確認できます.<br><br><img src=

ためしにデフォルト状態で生成した鍵の素性は以下の通り3072bit になってます.




出来上がった公開鍵(id_rsa.pub)をRaspberryPi へ送ります.

まず,SSHでRaspberryPi に入り,送り先のフォルダ .ssh をホームディレクトリに作ります.
Linuxは外部から公開鍵を使ったSSH接続を試みられた場合,
このフォルダ内にある公開鍵を使います.

終わったら, SCPで公開鍵を送ります.

その後,autorized_keys に追記(初めての場合は自動で新規作成されるし,公開鍵(id_rsa.pub)は削除します.

フォルダとファイルのアクセス権限を変更します(chmod).

  • authorized_keys ファイルを管理者のみ読み書きできるよう 600 に
  • .ssh フォルダは管理者のみが実行と読み書きができるよう700に

最後に,sudo vi /etc/ssh/sshd_config で,

・rootユーザでのログインの禁止

・パスワード認証ssh を無効化して,公開鍵認証sshのみ許可

を行い,SSHサービスを再起動し,

ログアウトします.

最後に,クライアント側からSSH接続できるか確認します.

明示的に 秘密鍵を指定する場合は,
ssh -i id_rsa mypi@192.168.1.3 のようにします.

以上で,Raspi にHeadless(モニターやキーボード類を準備しなくてよい)環境を構築できました.

Micro Maqueen with remote operation / マイクロマックイーンをリモート操作する

初めに

マイクロマックイーンをリモート操作する拡張機能を作りました。まぁまぁ使えるもののしばらく間が経ってしまうとどうやってプログラムすればいいかわからなくなってしまうので覚書として残しておきます。

プログラムの手順

  • 新規プロジェクトをmakecode上で2つ作成する。一つはreceiver(受け手)、もう一つはsender(送り手)とする。
  • まずはreceiverを開いて 「高度なブロック」->「拡張機能」を開く
  • 以下のurlを検索窓に入力すると以下のような画面が表示されるのでクリックする。
    • https://github.com/kichinosukey/super-hand-power.git
  • 以下のように「HandPower」と「Maqueen」が拡張機能として追加されている。
  • 続いて以下のようにプログラムを追加する。
初めに無線通信のグループを定義(番号はreceiver-senderと共通であればなんでも良い)し、無線で受信した番号をreceiver関数の第一引数に設定する。第二引数はreceiver内部の処理が都度終了するたびに発生する待ち時間[ms]。第三引数はモーターの回転スピードを0-255で指定可能。
  • senderも同様に拡張機能を追加したら以下のようにプログラムを追加する。
無線グループはreceiverと同じく1、sender関数の第一引数はreceiverの第二引数と同様に処理の待ち時間となる。

動作風景

Build your own extension for Microbit in Make Code Editor / メイクコードエディタでマイクロビットの拡張機能を自作する

前提

– Githubアカウントを作成済み(ですよね?)

手順①MakeCodeEditor上で任意のプロジェクトを作成。

ここでは”hoge”とする。

手順②プロジェクトをGithub上にリポジトリとして登録する。

まずはGithubアイコンをクリック。

そのまま「つづける」をクリック。

Githubでリポジトリが作成済みであることを確認。

手順③エディターに戻りJavaScript編集画面を開く。

元のコードは全部消してしまおう。

手順④ブロックを作成する

「hoge」というブロックにしよう。実際のコードは以下。

/** 
 * これはHoge(ホゲ)という何にも役に立たないクラスです
 */
namespace Hoge{}

これだけでは拡張機能としてエディターに追加されないのでGithubアイコンをクリックして変更内容をリポジトリにコミットする。

「変更をコミットしてプッシュ」をクリック。

プッシュが完了したら拡張機能を検索してみる。「高度なブロック」⇨「拡張機能」

自身のリポジトリURLで検索かけると「hoge」がヒット。こいつをクリックして追加してみる。

ふむ、変化がない。そうなんです。これではまだブロックが追加されないのです。

手順⑤本当にブロックを追加する

中身となる関数を用意する。これも「hoge」、わかりづらい・・・。

/** 
 * これはHoge(ホゲ)という何にも役に立たないクラスです
 */
namespace Hoge{
    //% blockId=hoge
    //% block="hoge %huga"
    export function hoge(huga: number): void
    {
        basic.showNumber(huga)
        }
}

そしてコミットするとほら、追加されてるでしょう黒いのが?

とはいえ使うには(使えないが)ちょっと不親切なので修正を行う。

手順⑥ブロックのプロパティ設定

変更できるのは以下の4つ。

  • 色(color)
    • ここの値設定の考え方はよく分かってません、すいません
  • 優先順位(weight)
    • 値の上下限値は不明ですが大きければ大きいほど上位に表示される模様
  • アイコン(icon)
  • ブロック名(block)
    • こちらも任意に指定可能。公式ガイドをとりあえず真似てみた。
/** 
 * これはHoge(ホゲ)という何にも役に立たないクラスです
 */
//% color=190 weight=100 icon="\f5d0" block="Basic Blocks"
namespace Hoge{
    //% blockId=hoge
    //% block="hoge %huga"
    export function hoge(huga: number): void
    {
        basic.showNumber(huga)
        }
}

ひとまずこんなもんでしょう。これを拡張していくと好きな機能をどしどし追加できる。少し前とは違ってだいぶ機能追加がしやすくなってる。さすがMSさん、これからもどんどんよろしくお願いします。

参考リンク

https://makecode.com/extensions/getting-started

https://makecode.com/defining-blocks

Arduino micro pro を使って自作キーボードを作った話

作ろうと思った背景

子供の教材開発の一環で,microbit の次のステップとして Arduino を想定していて,
その使い方を学んでいるときに,HID機能というものを知りました.

これは何かというと,ヒューマン・インターフェース・デバイスの略称で,
USB接続であたかもキーボード,マウスのように振舞う(なりすます)ことが
できる機能のことです.

このいわゆる「なりすまし」が使えると,
「ある1つのボタンを押したら,xxxというキー入力をする」とかが
出来るようになります.

本当にそんなことが出来るのだろうか,難しくないのだろうか,と思ったので,
試してみた結果が本記事の内容です.

準備するもの

  • Arduino micro pro ※今回は,Amazon で3個で1980円の互換品を使用
  • microUSBケーブル
  • ブレッドボード
  • タクトスイッチ
  • ジャンパワイヤー

配線

Amazon で購入した Arduino micro pro 互換品は,ピンヘッダが半田付けされていないので,
最初にそれをはんだ付けする必要があります.
はんだ付けするにあたっては,ブレッドボードにピンヘッダを差し込み,
その上に,Arduino micro pro を乗せて,はんだ付けすると足が斜めにならずに済みます.

fig1. Arduino のはんだ付け準備 その1
fig2. Arduino のはんだ付け準備 その2 – ピンヘッダをブレッドボードに差します
fig3. Arduino のはんだ付け準備 その3- ピンヘッダに Arduino を置き,はんだ付け

次にブレッドボードに,Arduino, タクトスイッチを配置して,
ジャンパワイヤーで繋げていきます.

  • Arduino GND → スイッチ赤 → スイッチ青
  • Arduino 5番 → スイッチ青
  • Arduino 6番 → スイッチ赤
fig4.タクトスイッチは,赤丸で囲んだ隣同士の足がスイッチを押したときに繋がります
fig5. 配線図

プログラミング

  • Arduino へプログラムを書き込むための IDE をここからインストールします.
  • Arduino を起動し,Tools → Board: “Arduino Uno” → “Arduino Leonardo” を選択します.
fig6. 書き込むボードの対象を Arduino Leonardo にする
  • 補足すると,Uno は先述のHID(なりすまし)機能を持っておらず,
    ゆえにそのライブラリもありません.
  • Leonardo は HID機能を持ち,そのライブラリを持っています.
  • 今回はそのライブラリのうち,Keyboard.h というものを使っていきます.
  • なので,Board として Leonardo を選択する必要があります.
  • 次に,Arduino を microUSBコードで繋げて,PCに繋ぎます.
  • 書き込み先(ポート)の指定をしてあげます.
  • Tools → Port → COM3(Arduino Leonardo).
  • もしかしたら,PCによってはCOM3 と認識されないかもしれないです.
  • それっぽいもの(笑) を選びましょう.
fig7. 書き込み先 Port の指定
  • 下記コードを貼り付け,適宜好みに合うように編集します.
#include <Keyboard.h> // キーボードライブラリの読み込み

#define Button5 5 // 5番ピンを Button5 と呼ぶことにするよ
#define Button6 6

void setup() {
  Keyboard.begin(); // キーボード機能を使うおまじない
  pinMode(Button5, INPUT_PULLUP); // Button5 をプルアップしておく.スイッチ青を押すとGND に繋がる
  pinMode(Button6, INPUT_PULLUP);
}

void loop() {
  // Button5 が押された時の動作設定
  if(digitalRead(Button5) == LOW){ // Button5 がGND になったら,つまり,スイッチ青が押されたら
    Keyboard.print("hogehoge"); // hogehoge と入力される.
    Keyboard.write(9); // TABが入力される.参考先:http://www.asciitable.com/
    Keyboard.print("fugafuga");
    Keyboard.press(KEY_RETURN);
    delay(100); //wait PC busy // PC側が入力を受け付けるまで100ms待つ
    Keyboard.releaseAll(); // キーを離す

    while(digitalRead(Button5) == LOW); // Button5 が連続で入力されてるとき,無視する
  }
  // Button6 が押された時の動作設定
  if(digitalRead(Button6) == LOW){
    Keyboard.print("fugafuga");
    Keyboard.press(KEY_RETURN);
    delay(100); //wait PC busy
    Keyboard.releaseAll();

    while(digitalRead(Button6) == LOW);
  }
  delay(100);
}
  • File → Save as … より,ファイルを保存します.
fig8. File → Save as… より,プログラムファイルを保存する
  • プログラムを Arduino に書き込みます.
fig9. プログラムを Arduino に書き込む.赤丸のところの矢印を押すだけ.押すと黄色くなります.
fig10. 書き込み終わると,黄色くなってたボタンが元の色に戻り, Done uploading と出ます.
  • あとはメモ帳を開いて,タクトスイッチを押してみましょう.
fig11. メモ帳を開いて,タクトスイッチ青を押した図

むすび

やってみて,一番初めに思ったのは,「超簡単にできる!」です.

キーボード自作というと,正直ベーシック的な処理をいっぱい書かなきゃいけないのかな,と
勝手にイメージしていたのですが,今回書いたのは全部で35行程度でした.

で,これを作ってから,自作キーボードのその道には,もっと簡単に自作キーボードを作ることができる,QMKというファームウェアが存在することを知った(知ってしまった)ので,次はQMKについても記事を書こうかな,と思ってます.

ご参考:fabcross さんでも特集していたようです.
https://fabcross.jp/category/make/20200427_Zoom.html