2020年7月27日月曜日

EagleでV-cutを指定してJLCPCBに注文する

*2020年07月29日 コピー手順を加筆しました。

V-cutは、端から端まで横断するV字の溝です。小さな基板を複数まとめて作り、実装が終わったところでポキンと折ります。スキージング回数は減るしpick&placeもまとめてできるし基板費用も安く済むので大変ありがたいです。

今までわたしは、Panel by JLCPCB、つまり1枚分の基板データを渡して、「あとは縦x枚、横y枚に割り付けてください」ってお願いするだけでした。

が、これだと同じ基板を複数作ることはできますが、異なった種類のものを同じ基板に割り付けるのは自分でやらないといけません。

ってことで、やってみました。

■コピー元のデータを用意する■

当然、Eagleを使って基板を設計します。今回は、秋月で売ってるGaN MOSFETブレイクアウト基板を2種類作りました。

■パネライズする■

出来上がったボードデータをそのままコピーしようとしても、部品番号が自動的にインクリメントされたりでうまくいきません。そこで、パネライズします。なお、パネライズしたあと、Saveしてはいけません。

パネライズはツールバーのオレンジ色の「Run ULPボタン」をクリックし、


検索欄にpaneと入力すると絞り込まれてpanelizeが残ります。panelizeをダブルクリックします。


これでtNames, bNamesが部品番号と切り離れた_tNames, _bNamesにコピーされます。

基板全体をGoup Copyし、SaveせずにWindowを閉じます(Panelizeした状態で上書きするとこの後の修正時などに掃除が大変)。

【追記07/29】全体のGroup Copyの際には 、以下の手順がオススメです。

  1. 表示LayerでShow Layersボタンを押して全レイヤーを選択
  2. 20 Dimensionだけを除外してOKボタン
  3. cmd+Aで全選択
  4. カーソル位置を原点にあわせて座標表示が0,0になるのを確かめてcmd+C
特に4番大事。これやるとペースト先で座標がずれません。え?知ってました? 私知らなかったです……。Windowsの方は適宜キーを読み替えてください。【追記終わり】


■新しいボードを作りペースト■

File->New->Boardで新しいbrdを作ります。回路schは不要です。

JLCPCBの場合、パネライズの最低サイズは70x70mmなのでこれ以上になるようにします。あまった部分に詰め込んでもいいですし、さくっとカットしてもいいです。

カーソルを原点に合わせてからcmd+Vでさっきコピーしたボード図をペーストし、正しい位置に置きます。同じものが複数必要ならば、正しい位置に必要な回数コピーします。saveします。複数の回路を組み込む場合は、パネライズとペーストを繰り返します。

基板の配置は、かならず碁盤の目のように縦横が並んでいないといけません。冒頭に書いたように、V-cutラインは端から端まで一直線に横切らないといけないからです。

■V-cutのラインを入れる■

アイコンからLineを選び、レイヤーとしてVscore、太さ0.5mmを指定します。太さは0でもいいですが、カットする幅が必要なのでカット幅がパターンやシルクをケズらないか確認する意味でも太さを指定した方が良いと思います。

端から端まで縦縦縦縦横横横……と線を入れていきます。なお、下の図で、下の方にやたらスキマが開いているのは、70x70mmというルールに後から気づいた(指摘された)からです……。 もともとの設計は60x50mmだったのですが、今回の基板、四隅の固定ネジの間隔は決まっているので、もったいないですが左右と下に余白を追加しました。なお、V-cutを依頼する場合、JLCPCBでは70x70mm、ALLPCBは80x80mmが最低外形寸法です。


■Gerber出力■

いつものCam processerを使ってGerberを出力しますが、いつもと違う点が2つ。processorによって違うかもしれないので、私がいつも使っているSystem Example -> Third Party -> OSH Park -> OSHPark_2_Layer.camを例に説明します。


まず、Gerber下のBoard Outlineには、Edit Layersのボタンから「Vscore」を追加します。これをしないとV-cut用に書いた線がgerberに出力されません。


Vscoreを追加すると、右の窓にgerber線が追加されます。


次に、Top Silkscreenでは、同様にEdit LayersボタンからもともとのtNamesを除外し、_tNamesを選びます。裏面にもシルクがある場合も同様にbNamesを除外して_bNamesを選びます。

あとは、Process Jobをクリックすれば、.zipが出来上がります。

■発注時の注意■

JLCPCBに注文を入力する際に、何種類のデザインが混在しているか、を忘れずに選びます。Different Designを2以上にすると自動的にDelivery Formatが「panel by Customer」に切り替わります。


あとは、いつものように発注しましょう。

あ、パネライズ初体験の場合は、チェックアウトの3.Submit Orderのところで「Review Before Payment」を選んだほうが良いと思います。私もやらかしてキャンセル→再注文になってしまいましたので……。

2020年7月15日水曜日

インターフォンからSMSを送りXiaomi mi bandへ通知



耳が聞こえないとインターフォンが聞こえないのでsmart bandに通知を送りたい。

ずっと考えていましたが、小雨降るお散歩中に簡単な方法を思いついたので、作ってみました。構想半年、アイデア30分、実装1時間、ブログ2時間ってやつです。

なお、タイトルは途中経過を大幅に端折ってます。

実際には
  1. 呼び鈴を押す
  2. インターフォンの画面が明るくなる
  3. APDS9930で明るさを検知
  4. ESP32でIFTTTを叩く
  5. IFTTTが私のiPhoneにSMSを送る
  6. iPhoneが着信
  7. Xiaomi mi bandに着信通知
という流れです。

■SMSは有償です■

ところでSMSの送信は有償です。今回使うclicksend.comだと1回約5円です。clicksend.comのアカウントを取得すると100円分のチャージが7日間使えます。実験であればそれで試せます。それでイケるとなったらカード番号など登録しましょう。

なんで自分ちのインターフォンが有償なんじゃい?!という気持ちがないではないですが、まぁ聴覚障害者として生まれちゃったのでしょうがないですね。

我が家の場合、比較的単価の安い荷物はみんな宅配ボックス、そうでない荷物や書留などについては電話で呼び出してもらってます。残りは生協ぐらいですが、生協は対面で受け取ると保冷ボックスが不要で手間がかからないというメリットがあって、それはまぁ5円に見合うのではないかと思っています。

■必要資材■


■IFTTTの設定■

アカウントのとり方などは他の方のブログを参考にしてください。以下の手順でIFTTTにサービスを追加します……「サービス」であってます?呼び方がわからん。
  1. ブラウザでHOME画面の右上、Createをクリック
  2. 「If」の後の「+」をクリック
  3. Search Servicesで「Webhook」と入力し「Webhooks」をクリック
    WebhooksはIFTTTの特定のURLを叩くと起動します。ESP32からのアクセスにうってつけですね。
  4. 「Receive a web request」をクリック
  5. 「Event Name」を入力します。今回は画面の明かりが点灯したことをトリガーにするので「light_up」と入力し、create triggerボタンをクリックします。
  6. If Thenのあとの「+」をクリック
  7. ClickSend SMSを選びます。
  8. 青い「Send SMS」をクリックします。
  9. Toにスマフォの電話番号を入力してCreate actionをクリックします。
  10. Finishをクリックします。
と、すみません。6-10のどこかでclicksend.comのアカウント取得画面に飛ぶのですが、スクショ取りそこねてしまいました。特に難しいことはないと思います。

ともあれ、これで特定のURLを叩くとSMSに通知が飛ぶ、というサービスができました。試すには
  1. ブラウザ上でIFTTTのHomeに戻る。
  2. Webhooksをクリック
  3. 右上のDocumentationをクリック
  4. 「Make a POST or GET web request to:」下の{event}にlight_upと入力
  5. value1, value2, value3には適当な文字列などを入れてみる。
    入力するとそれにつれてcurlのパラメータが変わっていきます。
  6. Test itのボタンをクリック
数秒後にさっきToで登録した電話番号にSMSが届きます。

ここでcurlの-d以降の部分をhttp postすれば中身がメッセージとして送られますが、 今回の用途ではSMSだけ送ればいいのでhttps以降だけを叩くのが簡単です。今回もそれで済ませてます。ごめんなさい。

■ハードウェアの接続■

私は以下のブログを参考にしました。ってわしのブログや。どんなつまらないことでもブログに残しておくべきだなぁとしみじみ思う今日このごろです。

CJMCU-9930ESP32
VL3.3v
GNDGND
VCC3.3v
SCL22
SDA21

ブログと異なり、INT - 2の配線は不要です。

■ESP32の実装■

APDS9930のサンプルプログラムを元に、http secureのサンプルを切り貼りしました。コピペエンジニアリングです。ごめんなさい。
//
//  WiFi Secure, IFTTT
//

#include <WiFiClientSecure.h>

#define ssid     "....ssid...."
#define password "....password...."

const char*  server = "maker.ifttt.com";  // Server URL

const char* test_root_ca = \
 "-----BEGIN CERTIFICATE-----\n" \
"MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\n" \
"MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\n" \
"DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\n" \
"SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\n" \
"GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\n" \
"AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\n" \
"q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\n" \
"SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\n" \
"Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\n" \
"a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n" \
"/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T\n" \
"AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\n" \
"CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\n" \
"bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\n" \
"c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\n" \
"VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\n" \
"ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\n" \
"MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\n" \
"Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\n" \
"AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\n" \
"uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\n" \
"wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\n" \
"X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\n" \
"PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\n" \
"KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n" \
"-----END CERTIFICATE-----\n";

WiFiClientSecure client;

void submit() {
  Serial.println("\nStarting connection to server...");
  if (!client.connect(server, 443))
    Serial.println("Connection failed!");
  else {
    Serial.println("Connected to server!");
    // Make a HTTP request:
    client.println("POST https://maker.ifttt.com/trigger/light_up/with/key/....api key.... HTTP/1.0");
    client.println("Host: maker.ifttt.com");
    client.println("Connection: close");
    client.println();

    while (client.connected()) {
      String line = client.readStringUntil('\n');
      if (line == "\r") {
        Serial.println("headers received");
        break;
      }
    }
    while (client.available()) {
      char c = client.read();
      Serial.write(c);
    }

    client.stop();
  }
}


//
//  APDS9930
//

#include <Wire.h>
#include <APDS9930.h>

// Global Variables
APDS9930 apds = APDS9930();
float ambient_light = 0; // can also be an unsigned long
uint16_t ch0 = 0;
uint16_t ch1 = 1;



//
//  setup
//

void setup() {
  // Initialize Serial port
  Serial.begin(115200);

  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  // attempt to connect to Wifi network:
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    // wait 1 second for re-trying
    delay(1000);
  }

  Serial.print("Connected to ");
  Serial.println(ssid);

  // Initialize APDS-9930 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9930 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9930 init!"));
  }

  // Start running the APDS-9930 light sensor (no interrupts)
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("Light sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during light sensor init!"));
  }

  delay(500);
}


//
//  loop
//
uint32_t prevMillis = 0;

void loop() {

  // Read the light levels (ambient)
  if (  !apds.readAmbientLightLux(ambient_light)) {
    Serial.println(F("Error reading light values"));
  } else {
    Serial.print(F("Ambient: "));
    Serial.println(ambient_light);

    uint32_t thisMillis = millis();
    if ((prevMillis == 0 || thisMillis - prevMillis > 180 * 1000) && ambient_light > 50) {

      submit();

      prevMillis = thisMillis;
    }

    //    char fstr[16];
    //    dtostrf(ambient_light, 5, 1, fstr);
    //    M5.Lcd.drawString(fstr, 80,  70);
  }

  delay(100);
}

2020年7月9日木曜日

Arduino IDE + DRV8835 + ステッピングモーター



Seeed Xiaoと秋月のDRV8835基板を使って、さくっと動かします。

モーターはオリジナルマインドから中古で買ったオリエントモーターの42mmサイズバイポーラー。定格17V。

XIAOとDRV8835の結線は以下の通り。

XIAODRV8835その他の接続相手
GNDGND外部電源のGND, Volumeのmin側
5V出力Vcc, MODE
3.3V出力Volumeのmax側
3AIN1
4AIN2
5BIN1
6BIN2
7Volumeの中間
AOUT1モーターの黒
AOUT2モーターの緑
BOUT1モーターの青
BOUT2モーターの赤
VM外部電源の+側(5-17V)


DRV8835をステッピングモーター用に使う場合には、MODEをHIGHにします。こうすると、AIN2, BIN2 = HIGHのときだけ出力が有効になり、LOWにすると出力の電流がカットされます。AIN1に1個パルス(LOW->HIGH->LOW)を入れると正転、BIN1だと逆転します(モーターの配線や仕様によって変わりますので注意)。

今回、両手が塞がる用途でモーターを使うので、ミシン用のフットペダルを用意しました。3.5mmφのモノラル用ミニプラグ出力で踏まないと0Ω、踏むと約10kΩになります。GND - ペダルの片方 - XIAOの7ピン - 10kΩの抵抗 - 3.3V出力、という風につなぎました。こうするとXIAOへの電圧は0-約1.65Vの間で変化します。これをアナログポートで読み取ります。

ところで、リファレンスやググると出てくるサンプルコードを見るとスピード指定関数setSpeedの引数が rpm になっているけど、試したところではpps(1秒あたりのパルス数)みたいです。本家ArduinoでStepperクラスを使ったことないけど(あるいは忘れている)、少なくともXIAOでは。

ということで、ソースコードはこんな感じ。


#include <Stepper.h>

Stepper myStepper(200, 3, 5);

bool running = false;

void setup() {
  Serial.begin(115200);
  pinMode(4, OUTPUT);
  pinMode(6, OUTPUT);
}

void loop() {
  int value = analogRead(7) / 2 - 5;
  if (value < 0) {
    if (running) {
      digitalWrite(4, LOW);
      digitalWrite(6, LOW);
      running = false;    
    }
    delay(50);
  } else {
    if (!running) {
      digitalWrite(4, HIGH);
      digitalWrite(6, HIGH);
      running = true;    
    }

    Serial.println(value);
    
    myStepper.setSpeed(value) ;
    myStepper.step(value / 10);
  }
}


2020年7月2日木曜日

ちっこいGaNを動かしてみた

1号機も実は動いていた!
秋月でも入手可能なGaN N-ch FET。素晴らしい特性なのですが、4列の端子が0.4mmピッチで並ぶという極小パッケージ。ステンシル使ってリフローしてもちょっとシルクがズレたら失敗しかねないサイズです。

でも、とりあえず特性を調べてみたいんじゃよ。ということで、何とか配線してみました。ちょっとしたはんだ付けの腕試し、のつもりだったのですが……でも一打逆転の、ドラマです(プロジェクトXを見たので少し後遺症が……)。

■1回目:失敗(?)■

まず最初、両面テープに貼り付けてその上で作業しようとしました。


そしたら、熱伝導率があまりにも良くてハンダゴテをあてた瞬間に粘着剤が溶けてしまって作業にならず。逆作用ピンセットはバネが強すぎるので放熱クリップで挟んで作業しました。


この直後にピーン、と飛んでいってしまって諦めたのですが、ベッドのうえに着陸しているのを発見! 再作業して何とか3本配線できました。さっき3本目をつけようとして飛ばしてしまったので、失敗を繰り返さないよう予め2本をピンヘッダのうえにはんだ付けし、残り1本は先にピンヘッダの上にはんだ付けしておいて、そこからチップの上に曲げていき、ピンセットでおさえながらはんだ付けする、という方法を取りました。

ひん曲がりまくってますけども、チップになるべく負荷をかけまいと回り道していたらこんな形に……。強く引っ張ると電極が剥がれちゃうんですよね。


しかし。


デバイステスターで調べるとVgs65Vというとんでもない値が出てしまいます。失敗と判断しました(伏線)。

■2回目:失敗■

Twitterで「適当な0.4mmピッチの変換基板を使ったらいいのでは」とアドバイスをいただき、aitendoと秋月にQFPなどの変換基板を注文。先にaitendoから届いたので、さっそく作業します。


変換基板のパターンをカットするためには写真の超硬スクレーパーを使用しました。先端が三角錐になっていて、頂点で切り込みを入れて辺で削り取る、という使い方ができます。これを使うようになってからパターンカットで苦労することはなくなりました。おすすめです!


最初に左のカットをしたのですが、接着剤が柔らかくて加熱する前から曲がってしまったので捨てます。まぁ0.2x0.2mmぐらいしか面積がないので厳しい使い方だとは思いますが。


ペーストをのっけて、なるべくピン間に残らないように工業用綿棒のとんがったやつで掃除をします。これもとんがったところが意外と鋭くて細かい拭き取りができますし、円錐の直線部分は基板に密着して拭き取りが捗ります。通常の丸い綿棒だと点接触ですが、これは線接触なので吸い残しが出にくいのです。

何よりさすがは工業用綿棒、糸くずがほとんど出ません!綿棒なのに!!


この状態でリフロー路に入れて220度プロファイルで調理しました。うえは掃除後のやつですが、いい感じに止まっているじゃあないですか!(伏線としてのはんだボール残)


残りのソース端子も配線します。考えてみりゃ3番ピンがSなので別に配線しなくても良かったんですよね(伏線)。


結果です。見事に動作しません。この後、簡単なスイッチ回路を組み立てて試してみましたが、GS間が短絡しているようでダメでした(伏線回収)。

■3回目:成功!!■

3度目の正直は秋月のQFN基板、ハンダメッキ済です。GaNチップにはんだボールが乗っているので、ハンダクリームの載せない作戦です。


手を加える前の基板。結構ハンダ厚い。


削りました。今度はソースとゲートが短絡しないようにソース部分をまるごと削ってしまう作戦です。


サンハヤトの普通のフラックスを塗ります。黄色いのよね。


少し乾かしてからチップを載せました。松脂でベタベタの液に少し張り付いているだけなので、慎重にリフロー炉に入れます。が、うちのリフロー炉のドア、最後にガツン!ってイキオイがついてしまるんですよね……心配です(伏線)。


リフロー後です。ちょっとズレました。ソース電極がゲート電極側に寄ってしまったので短絡していないか心配です(伏線)。やる時には、カプトンテープなどでずれないようにしといた方が良いと思います。誰もやらないと思うけど。

結果。デバイステスターだと、1回めと同じ変な値が出てきます。だからVgs=65Vってなんすかああ! ……あれ、1回めと同じ不具合なんじゃなくて、1回めもこれも成功なんじゃね? GaNの特性が異次元過ぎて、デバイステスターが正常に判断できてないんじゃね??

ということで、LED駆動回路を組み立ててみました。


動きました(以外な結末)。


1回めのやつも動きました(冒頭の写真)。ゲート電圧をかけると点灯、GNDに落とすと消えます。バンザーイ!

ということで、微細なはんだ付けは楽しいな、ということでお送り致しました。

2020年6月13日土曜日

Rakuten miniでiBeacon受信

わー、Androidの記事何年ぶりだろー。

Googleの聴覚障害支援アプリを試したいけどお金がない……と思っていたところに楽天ミニが1円だったので買ってみました(貧乏人の発想ですね)。

聴覚障害支援アプリ、ヘッドホン繋げないので補聴器っぽいアプリはまだ試せていないんですが、音声書き起こしアプリは精度高いし英語と日本語切り替えワンタッチだし、素晴らしい。なにせ無料(貧乏人の限界ですね)。

もうこれだけで1円の元は取れましたが(この先も1円とは言ってない)、それだけではもったいないので、マイコンとの連携で遊んでみようと思います。お題はBeaconの受信です。ちゃんと通信するならBLEでガツガツ書けばいいんですが、Beaconはペアリングも不要で32bitのペイロードがあるのでマイコンからのちょっとした通知が非常に簡単です。

それはともかく、Android Studio最高ですね。

■参考にしたサイト■

とはいえAndroidに触るのは2.3以来、さくっと動かすだけで勉強するのは面倒くさい(金持ちになれない人の発想)ってんで、とっかかりが必要です。こちらの記事が大変参考/勉強になりました。

サクッとコピペします。ただ、ほんの2年前の記事ですがいろいろ変わっています。

「プロジェクト構造」からだとbeacon libraryが見えなくなってしまっているので、Dependencyは以下の2つを追加します。
    implementation 'org.altbeacon:android-beacon-library:2.17.1'
    implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
マニュフェストには以下を追加します。
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-feature
        android:name="android.hardware.bluetooth_le"
        android:required="true" />
    <uses-permission-sdk-23 android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
onCreateでビーコン関連を生成する前には以下のようにロケーションアクセスの確認が必要です。この辺iOSと同じっすね。
これでビルドして実機で起動するとBeacon使っていいか?とダイアログが出てきます。

テスト用のビーコンとしては、Macのターミナルからビーコンの発信停止ができるmbeaconを使いました。

これを初期設定
$ defaults write mbeacon uuid -string "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
$ defaults write mbeacon measuredPower -integer -45
したあとに
$ mbeacon -major 0 -minor 0

でビーコンを出すとわりとすぐに「D/iBeacon: Enter Region」、ctrl+Cで止めると数秒後に「D/iBeacon: Exit Region」が表示されます。

よかったよかった。

■余談■

このところ、玄関に来客を検知したらAppleWatchに通知飛ばせないかと、アプリを書かない範囲でいろいろ調べてました。IFTTTからslack, twitterまでは瞬時に通知が届くんですが、その先がどうも不安定でお客さん待たせてしまう、ってんでボツ。

だったのですが、楽天ミニならポケットに入れっぱなしでも気にならないので、Androidで作ろうかなと思ってます。iOSこういうのをサクッと作れないからね(コーディングは簡単。MFiなど周辺の縛りが面倒くさい)。

2020年5月2日土曜日

LCD SLA方式プリンタのLCDパネル交換


■液晶がダメになりました■

プリンタを使い始めたのは去年の10月24日。

作動時間を記録する機能はないけど、USBメモリに残っているファイルは全部で241個でした。同じのを複数回出力していることもあるので250回ぐらいでしょうか。

最初に液晶の欠陥が出たのは2ヶ月ほど前、1x1.5mmほどの小さな楕円でした。そこにブツが行かないように騙し騙し出力していましたが、とうとう今日、でっかい穴が2個。

ということで、購入時に付属していた液晶パネルと交換しました。ただ、一緒に交換するはずの固定シールが見当たらず。カプトンを使おうかと思いましたが再利用できたのでそのまま。

Orange 30は各種メンテナンス方法が全部英語字幕付きの動画になっていてありがたや。

必要な道具はアーレンキーとシールの端っこを剥がすためのスクレーパー、払拭用JKワイパーとIPAだけ。スマフォがレジンで汚れるといかんので写真取ってないですが、

  1. バットとビルドプレートを外す
  2. 横倒し
  3. 2個のネジを外して底パネルを開ける
  4. コネクタを固定しているパネルのネジ2個をはずす
  5. コネクタを抜く
  6. 立てる
  7. スクレーパーでシールのスキマを剥がす
  8. 破らないように丁寧にシール剥がす
  9. 液晶を載せ替える(向きに注意←間違えた)
  10. 丁寧にシールを貼る
  11. 横倒し
  12. コネクタを挿す
  13. コネクタを押さえるパネルのネジを固定
  14. テストモードで動作確認
  15. 底パネルをネジで固定
  16. 立てる
  17. 掃除する
  18. バットとプレート付ける
という感じです。

久しぶりに欠陥がなくなりました。



2020年4月21日火曜日

ラズパイに安い1.3インチST-7789液晶を接続する

ケースもわしが作った

またしても「確かめてから買う」を怠ったために苦労しました。

えーと、Amazonで1.3インチ240x240ドットのカラー液晶がやけに安いです。なので、飛びついて買ったのですが、SPIに必須のはずのCS端子がありません。

ラズパイでこれを動かすには、いろいろ探したのですが……

端子名ラズパイPIN番号
GND20
VCC17
SCL23
SDA19
RES13
DC22
BLK18

上記のように接続し、こちらのライブラリを使います。

ラズパイでリポジトリをクローンし、
git clone https://github.com/solinnovay/Python_ST7789

cd Python_ST7789
sudo python setup.py build
sudo python setup.py install
cd examples/
python clock_EN.py 

これで画像がパラパラ表示された後、時計が動くはずです。

事前にpip install ST7789を実行したら別のライブラリが入ってしまってしばらく呻吟しました。



なお、例によってケースを3Dプリントで作りました。が、円錐形のピンに基板をぎゅっと押し込んで固定するというハラでしたが、基板を取り外すときに斜めに力がかかって折れました……やっぱり可撓性のあるツメとかじゃないとダメですね。

てへ。

【追記】冒頭の表示のまま8時間ほど放置していたら、表示が焼き付きました。OLEDと違って明日の朝までにはほとんどわからなくなっていると思いますけど、こういう特性のものだというのは把握しておいた方がいいかと思います。

【追記の追記】翌朝には消えていました。はい。


2020年3月21日土曜日

電池でニキシー管を点灯させる

秋月でリチウム電池CR1225がやけに安かったので思いつきました。1個4円て。

真面目な実験ではないです。子供の頃から一度やってみたかった。後悔はしていない。

なおちっこいリチウム電池といえども山程つかえばそれなりの電圧はでます。感電などの事故や廃棄時の火災などには十分気をつけてください。

点灯中の写真取る前にバラしてしまった……


■回路■

SN74141互換のKM155ID1でニキシー管をドライブし、Seeeduno XIAOで制御します。XIAO用の電源はそのままUSBから取ります。ニキシー管駆動電圧はCR1225を44-45本直列にして約145Vを発生させます。

電池のGNDとマイコンとKM155ID1のGNDが浮かないようにしっかり配線すること以外は特に注意することはないです。KM155ID1のABCDとXIAOのGPIO4本を接続します。KM155ID1のVCCはXIAOの5Vピンと接続します。XIAOは3.3V動作ですが、XIAOからの出力電圧は、KM155ID1の入力スレッショルド電圧より充分高いので問題ありません。

KM155ID1が勿体ないので16ピンのICソケットを使っています。ニキシー管IN-12Bは今6本で3-4000円ぐらいでしょうか。ニキシー管用ソケットKM155ID1はアマゾンで買いました。IN-12Bはウクライナの業者さんから500本買ったうちの1本です。これもアマゾンでも買えます

XIOAは基板にピンソケットを取り付け、XIAOにはピンヘッダをはんだ付けしています。なんかソケットだらけの基板ですわ。

■電池ボックス■

Orange 30で出力しました。SK水洗いレジンを使ってます。このレジンは少し厚くなりやすいので、電池の直径の12mmに0.5mmプラスした筒を作り、両端にカバーを作りM3のネジ穴をあけ、上をカバーで覆っています。手で電池を入れるとあぶないので、セラミックピンセットが通る隙間を立てに開け、中心付近からも電池を入れられるスリットを作りました。

私にしては珍しく出力一発目で完璧でしたっ



STLデーターこちらからダウンロードできます。

SK水洗いレジンに限りませんが、SLA方式3DプリンタでのM3, M4などの細いネジをモデル化した場合、一応ネジっぽいものが出力されますが、ネジを通すとカスが大量にでます。タップを買っておいて、中仕上げと仕上げを通しておきましょう。タップハンドルなくても手で回せますし(ただ刃で手を切らないように気をつけて)、金属にねじ山を切るときのように1/2回して1/4戻す、とやらなくても大丈夫です。これだけでネジがするっと入るようになりますし、ネジ山崩れにくくなります。まぁ……力入れすぎるとボリって崩壊しますけども。そのためにスプリングワッシャーで「ギリギリ強く締めなくても緩みにくい」ようにしておきましょう。


■配線■

秋月のD基板上に配線します。

最近またジュンフロン使ってます。ちょっと前まで架橋ポリエチレン被覆を使っていたのですが、ジュンフロン被覆はワイヤストリッパー要らないんですよね。


  1. ハンダゴテに少し多目にハンダを乗せる。
  2. ハンダゴテの表面に垂直にジュンフロン線を当てて2-3秒
  3. ジュンフロン被覆がツーッと縮んで1〜1.5mmぐらい導線が出てくる
  4. フラックスを塗って、改めてハンダメッキする


これだけで使えます。熱で縮んだ分だけ末端が少し太くなりますが。



電池は電池ケース両端のネジ穴にM3のネジを通して電線を巻きつけました。スプリングワッシャを入れて電線を押さえつつ、電池を潰さない程度に押さえます。

くれぐれも感電しないよう気をつけてください。GNDとつみあがった電池の中間付近でも70V出ていますので結構ビリっとくるはずです(私はやらかしませんでした。感電こわい)。

■ソフト■

ソフト呼ぶのも恥ずかしいほど簡単ですな。ビットが順番に並んでいないのは、KM155ID1/SN74141のABCDが順番に並んでいないためです。

私はこういう場合、配線がGPIOとピン並びが平行になることを優先します。プログラムの処理が複雑にならない場合は、ぱっと配線を見て確認できる方が間違えも少なくなりますし、基板にしたときも簡単です。まぁこれ基板起こすことないと思うけども。

void setup() {
  // put your setup code here, to run once:

  Serial.begin(115200);
  pinMode( 7, OUTPUT);
  pinMode( 8, OUTPUT);
  pinMode( 9, OUTPUT);
  pinMode(10, OUTPUT);  
}

int num = 0;


void loop() {

  digitalWrite(10, (num & 1) ? HIGH : LOW);
  digitalWrite( 9, (num & 8) ? HIGH : LOW);
  digitalWrite( 8, (num & 2) ? HIGH : LOW);
  digitalWrite( 7, (num & 4) ? HIGH : LOW);

  num++;
  if (num > 9) num = 0;           
   
  delay(200);
}

2020年3月15日日曜日

3Dプリント:ゴミ箱


レジン系のゴミ、有機溶剤蒸気が出るので部屋の外に仮置してるけども、めんどくさい。

水洗レジン導入であまりガスでなくなったので、密閉できて匂いがもれないというおむつ用ゴミ箱を買ってみた。ビニールの筒をねじって締める方式。ビニールの筒のコストが高いけど、おむつでも110回使えて1000円+ぐらい。レジンはおむつほど高頻度で捨てないから利便性が得られるなら、と買ってみた。

思ったより大きいのでゴミ箱と置き換えての運用、普段のゴミも入れててレジン系ゴミを入れたらひねって密封する。

使ってみると、蓋が開けにくい。つるつる滑るので、開いた!と思ったら反動で閉まっちゃうことを何度か繰り返す。軽いので片手で開けるのは困難、後ろに壁があれば何とか。作業の前に開けておきましょう。

密封といっても融着するわけではなく、ビニール袋をカートリッジごと回転させてヒネる方式なので、ぜんぜん漏れないというわけではない。写真右側にある出っ張りを手でぐるりと1回転。ロックなどがあるわけではないので、任意の角度(回数)回せます。

蓋についているどーんとした出っ張りでゴミを押し込む。ゴミに触れなくていいけど、これが重くて蓋を開けにくいのだった。

まぁゴミ箱の中身が見えないのは良いかな。開けにくいのは辛いので、指が滑らないように「おゆまる」でツマミを作ってみようと思。

2020年3月13日金曜日

SLA 3Dプリント:レジンのレビュー

新しいのを試したら上の方に加筆します。ただ、「ANYCUBIN Plant-Basedレジン」シリーズで特に不満ないので、しばらくはこれが主力になるかと思います。また新しいのが出たら試してみます。タフレジンは……いつになるかな……。

未検証
  • SK本舗 Siraya Tech Blu タフレジン 500g

検証中
  • なし
検証済

■ANYCUBIC Plant-based 緑(透明)1000ml■

Amazonで買えます。「ANYCUBIC 植物基樹脂 光造形3Dプリンター 専用レジン 1L 無臭 DLP/SLA/LCD 3Dプリンタ向け 環境に優しい (透明緑)」、6/15現在で6,099円。

500mlだとAli3700円、Amazon4600円ですが、1リットルだとほぼ同じでAmazonならすぐ届きます。

現在、我が家の主力レジンです。不透明レジンと比べて沈殿物がないので撹拌の手間が少なく、完全な透明ほど紫外線が抜けて造形に影響することが少ないので愛用してます。現在2リットル目がそろそろ無くなるところ。

臭いなどについてはオレンジと同様です。白より少し臭う感じで、紫外線後硬化してカバーをあけると少しもわっと来る感じです。

使用開始:2020/03/25
開封時の匂い:少し
硬化中の匂い:少し
硬化直後の反り:少ない

硬化時間は少し長くしています。50umで80秒/10秒、100umで120秒/12秒です。白・オレンジと同じだとビルドプレートから剥離したい箱の途中で厚みが代わるところで剥がれたりしましたので。上記数値ではちょっと太り気味ですが安定しています。

光が当たらないと暗い緑ですが、光が通るとちょっといい感じの色です。



実用品を作った場合、同じシリーズのレジンと同様狂いは少なく変形が出にくいので、日常品や治具を作るのに向いてます。



■SK本舗 SK水洗いレジン500g 『白色』500g■

SK本舗さんの《SK02W》SK水洗いレジン500g 『白色』です。初めての水洗い、楽しみです!

購入日:2020/03/08
使用開始:2020/03/13
開封時の匂い:感じない
出力後の匂い:感じない
後硬化の匂い:やや臭い


まず板の出力。水道でじゃぶじゃぶ洗えます(そりゃそうだ)。ANYCUBIC Wash and Cure Machineで4分硬化。プラットフォームから剥がす時に折ってしまった。硬化した後、もう一度端を折ってみようとしたがわずかに変形するだけで折れず。主観ですが今まで使ったレジンで一番強い感じです。


色味は単独で見ていると黄ばんでるという感じは少なく、目に優しい白、の範囲だと思います。でもコピー用紙とかAppleトラックパッドの上に置くと黄色いですね……。


50um8秒、説明に従って初期層を6層から3層に減らしてみた。ビルドプレートすぐ上で曲面のオーバーハングがあるところで少し破綻。やっぱ6層にしないとダメですね。あと説明に従って水洗浄後半日置いてからcureしたら2分で充分でした。寸法精度は上の出力で水平方向長軸で65.00mm→64.05mm、水平方向厚み2.00→2.20mmでした。出力で少し太るのはSLAの特性として、縮小はそれなりでしょうか。なおトランプ立て(バットの縁にトランプを立てておく)を復活したのは、バットに入れておくと沈殿しやすいということなので、かき混ぜやすいように、と。


M5Stack台。ビルドプレートとものすごく強固に貼り付いていてシールはがしの刃を差し入れるのに苦労しました。ビルドプレートと密着する設計は良くないです。泡のハンドソープで水洗い。乾燥中。乾燥してからcureしたらこころなしか黄色みが増したような印象です。


ただ、他のレジンでも経験したことがありますが、黄ばんだやつを放置してたらまた白くなりました。

この後、経時変化を見てみます。お楽しみに。【追記】黄ばみが均一に薄れてきた感じで「オフホワイト」ですね。

残念な経時変化としては、ビルドプレートを止めている鉄のネジが錆びました……十分洗って乾燥させればいいのでしょうがネジのスキマに水が入ると簡単には乾かないんですよね。我が家としてはこれがネックとなって水洗いは使わない方向になりました【追記終わり】

■SK本舗 Siraya Tech Blu タフレジン 500g■

《ST01N》Siraya Tech Blu タフレジン 500g
(購入3/8)

■ANYCUBIC Plant-based オレンジ 500ml■

Ali語で「ANYCUBIC 植物由来の 405nm UV 樹脂フォトン光子 S 3D プリンタ印刷材料なし厄介な化学 resina impressora 3d」、AliExpressからFedExで送料無料の3,854円。

匂いは後記の白と同じはずだけど、何故か少し強く感じました。ただ、longer3d standardと比べれば弱くて、換気を普通にすれば気にならない程度かと思います。「換気をしなくても」と言いたい所ですが、硬化時にガスは出ているはずなので臭わなくても換気はしっかりしましょう。

使用開始:2020/03/09
開封時の匂い:少し
硬化中の匂い:少し
硬化直後の反り:

写真の色を評価するのは難しいですが、オレンジといってもかなり白っぽい色で、コンビニで売ってるような安いオレンジシャーベットの色という感じです。


最初に出力したこれは斜めの板やオーバーハングがあるので太サポートを付けて出力しましたが、やっぱりビルドプレート側の面は歪みますね。これはレジンのせいではなくSLA 3Dプリンタの特性なので仕方ないです。

【追記】最後に残ったやつを白のボトルの残りと混ぜて使ってみました。同ブランドの同品種だから良いかな、って。結果は特に問題なく、いい感じの色になりました【追記終わり】

■ANYCUBIC Plant-based 白 500ml■

Ali語で「ANYCUBIC 植物由来の 405nm UV 樹脂フォトン光子 S 3D プリンタ印刷材料なし厄介な化学 resina impressora 3d」、AliExpressからFedExで送料無料の3,854円。

Amazonだと「ANYCUBIC 植物基樹脂 光造形3Dプリンター 専用レジン 500ml 無臭 DLP/SLA/LCD 3Dプリンタ向け 環境に優しい (ホワイト)」、送料無料で4599円。500mlはAliの方が安く1Lならほぼ同様です。ときどき中国からの出荷が止まってしまうので最近はAmazonで1リットル買ってます。



第一印象として臭くないというより匂いしない。30分ほど硬化させてもほとんど黄色くならない。

使用開始:2020/02/07
開封時の匂い:しない
硬化中の匂い:少し
硬化直後の反り:2.5mm

放置しておくとどんどん反る。ただ、沿ったものはヒーティングガンで軽く温めて平らに伸ばすと、その後は反らなくなる。

■LONGSELL Photopolymer Resin 黒 500ml■




「LONGSELL Photopolymer Resin 光造形3Dプリンター専用 ABS類似 UVレジン多色 ブラック 405nm 500g/ 1000ml 無臭 LCD/DLP通用 3D造形材料 光硬化可能樹脂 3Dプリンタ向けレジン 多色 – 500ml(黑)」って長いわ>Amazon

在庫切れそうでAliに注文したのが届かなくて、急遽アマゾンに注文。届いた翌日にAliからも届いたので人生はままならない。500mlで3,899円。

出力したもののが粉っぽくない。染料系レジンみたいにツルツル。ただ洗浄したIPAを一晩置くと黒い粉が沈んでます。UVレジンの宿命として、完全な真っ黒ではなく黒スモークのアクリル板みたいな感じで、1-2mm以下ならMacの画面のあかりで十分透けて見える。

あと、やけに反らない。特筆すべきほど反らない。「厚さ3mmの板でビルドプレートと反対側に深い刻みが大量に入っている」という何をどうやっても反るわな、という状態でもほとんど反りません。いまのところ。普通なら後硬化すると反るんですけどね。うーん、間に合せのつもりでちょこっと買っただけなのに、意外と良いって困るじゃないか……。でもまあ長期保存するとどうなるかわからないのは皆様御存知の通り。

いやー、ほんと反らないわ(まだわからん

臭いはかなり強いです。Longer3D standardの3割増って感じかな。

【追記2020/02/07】「いかにも反る形状」のは反りました。ただ、Longer3D standard resinと比べると半分ぐらい。ただの板として出力したのは反らないままです。ただ、やっぱり臭いですね……換気はそれなりにしているんですが、使用をやめたら部屋に入ったときの加齢臭とレジン臭が加齢臭だけになりました(書いてて辛い)。少し長めに硬化しないと失敗しがち、臭い、ので今後は買わないです。【追記ここまで】

■HiEHA 3D 光造形3Dプリンター用 LED UV レジン■


大変きれい。

HiEHA 3D 光造形3Dプリンター用 LED UV レジン 500g 無臭 光硬化可能 汎用樹脂 アルコール洗い (透明イエロー)
Longer3D標準の透明レジンが黄ばみまくるので、それなら最初から黄色いの買っちゃえばいいんじゃね?と買ったもの。正解。

もちろん無臭ということはないんだけど、バットにレジンを入れっぱなしにしてアクリルのカバーをした状態で放置し、外出から戻っても部屋がレジン臭くないので、他のレジンよりは臭くないんじゃないかなーと思う。

透明度高い。かつてJobsさんが「キャンディのように美しいアイコン。舐めてしまいたい」と言ったことがありましたが、ほんとキャンディのようです。太陽光にあてっぱなしにしても違いがよくわからない。出力例はこんな感じ

硬化は遅い。100umの標準設定80秒+8秒ではサポートから剥がれてしまって、50umsw80秒+8秒、100umで80秒+14秒でうまくいった。あんまり追い込んでいませんが。

縮小率は1%程度。反る。出力した直後にも反るけど、その後1ヶ月ぐらいしたら板が三日月のようになっていて大笑い。かちっとした薄板構造を作るのは難しそう。

5,270円で今となっては少し高めのレジンだけど、透明度の高さと臭いの少なさはまぁ納得、かな。

反ったわー。反りやすい形状とはいえ大きく反った。

■Longer3D Standard clear■

他のLonger3D Standard Resinと基材は同じと思う。臭いも粘度も縮み方も同じ。

黄ばみ方も同じ。

これもKickstarterのオプションなので、価格不明。だけど、あんまり必要性を感じない。透明度を求めるなら他のレジンを買うと思う。


■Longer3D Standard 白 / 灰■


後硬化、短時間だと黄ばまないけど、柔らかい。

粉が沈殿するタイプ。ボトルをよく振ってから注ぎ、印刷前にはバットの中をトランプなどを使ってよくかき混ぜましょう。出力例はこの辺

縮小ぐあいは85mmの厚めの箱を出力して0.52mm。1%以下は優秀。

白は長時間後硬化すると古い下着のような黄ばみ方をします。灰色は青っぽい灰色なので、わかりにくいけど長時間日光にあてたものを出力したばかりのものと比べると黄色っぽくなっているのがわかる。

粉末が光を散乱するので、文字を透かし彫りしようとしてもぼやけてしまってあかん。

85x55x2mmの板の上にごちゃごちゃ載せたようなものだと、高さ5mmの逆三角形のリブを長辺にいれても盛大に反る。もうぐにょーんて感じ。同サイズで高さ10mm板厚2mmぐらいの箱にするとほぼ反らない。

50umスライスで80秒 / 6秒、硬化不良は起こっていない。標準だけあって使いやすい。

Kickstarterのキャンペーンで買ったもので、現在まだ AliExpressの公式店に出ていないので価格不明。


■Longer3D Nylon like resin clear■


この形状なら反らない。きれい。

これもKickstarterの追加オプションなので金額不明。

硬化は遅い。50umで80秒+14秒。遅い遅い。

ただ、後硬化しても黄ばまない! 透明のまま!! 臭いも少ないような気がする。

ということでぜひもう一度入手して追試したいものです。出力例はこれ

でも、下の通り、反りますねー。リブが入ってないとか設計も問題なんですが、それにしても反ってます。今度入手できたら、ちゃんと設計して出力してみます。

でも現代美術か! ってぐらい反るの……設計もよくないけどさ