2022年12月27日火曜日

PICマイコンデジタル時計キット Ver.3の表示部分だけ使う

前回から引き続き7セグLEDを利用したNTP同期型時計の作成。
先日の「超大型4桁LED表示キット」は秋月電子通商が販売している「超大型表示マイコンデジタル時計キットVer.4」の表示部分だけの基板なのだが、これを入手した当時はVer.4は販売されておらず、Ver.3が販売されていた。
で、Ver.3と超大型~表示キットを購入した結果、ver.3に元々付いていた表示部分の基板と7セグLEDが丸ごと使わずに残った。
このまま使わずに放置するのも勿体ないし、ICやマイコンも余分に買って余っているので、前回と同じような物の小型版を作る事にした。

このぐらいの大きさになるとケースは分割しなくても印刷可能で、表面のアクリル板も小さくて済む。端材を使ったので微妙に大きさが足りないが、自分で使う分には困らないだろう。
WeMOS D1 Mini互換ボードの取付部分は前回のケースで作ったから、少し微調整してほぼそのまま。縦横サイズはなるべく小さくしようと思ったので、今回ボタンは表示面に実装する。
適当な高さのタクトスイッチを表示基板の上に接着してタクトスイッチ用のスナップカバーを使って、表示面のアクリルからボタンが1~2mm程度飛び出すような感じにする。ボタンの接着位置は適当なので、アクリル板の穴位置は現物合わせで。穴径はスナップカバーがスムーズに動くギリギリのサイズを狙ってドリル径を0.1mmずつ太くして調整。

タクトスイッチスナップカバーはAliexpressで購入。この手の部品はamazonで購入しても結局中国から送ってくる事が多いから、amazonで購入する意味は殆ど無い。
因みにピン配列は「超大型4桁LED表示キット」と微妙に異なっていたので、DPと月日表示用のLEDの取り扱い部分を入れ替えたり、TM1637と基板のピンヘッダとの接続を少し変えたりしたけれど、基本的には殆ど前回と同じ。

まだマイコンとTM1637は余っているので、次は月差が1分ぐらい発生してしまう安物LED時計を改造してみようかな。

2022年12月18日日曜日

レーザー彫刻機「Atomstack P9 M50」を購入する

つい最近まで数万円で購入できる半導体レーザーで彫刻なんて出力が小さくて時間がかかるから面倒くさいと思っていたのだが、いつの間にか3.5万円も出せばレーザー出力10Wの彫刻機が手に入るようになっていた。(ブラックフライデー価格だったようで、今は5万円弱ぐらいするみたい)
今回購入したのは「ATOMSTACK P9 M50」という製品でXYのプロッター部分は1アーム式のお手軽な感じの物。

5Wレーザーを2本タンデムして10Wを稼ぎ出しているのだが、10万円出せば4本タンデムして20W出力の製品や、20万円出せば6本タンデムの30W出力の製品もある。
レーザーを束ねて出力を上げるには、プリズムやレンズ、レーザー発信機の取付、その他諸々の精度が重要になると思うのだけれど、なるほどホビーユース程度の精度ならこの金額で販売できるのか…
この手の製品は3Dプリンター同様、日本のamazonでも売られているので、色々な中華ECサイトと値段を比べなら、購入すれば良いと思う。メーカーや工場が中国や台湾なので、はっきり言って価格メリットが無ければ日本のECサイトで買うメリットは無い。amazonのマケプレ出品の商品を買ったところで、不具合があってもamazonが保証してくれる訳でも無く、出品者と交渉する必要があるなら、Aliexpressと何ら変わらない。

とりあえず、Inkscapeで画像を作ってLaserGRBLでレーザー彫刻機用のデータを作成。 1mm厚のアクリル板を四角く切り出すだけなら、LaserGRBLでも特に問題無く加工できた。

ATOMSTACKのM50を使って2.8mm厚のアクリルを切る際の設定はLaserGRBLの「Laser & Material Database」によると、100%出力、移動速度180mm/minで1パスらしいので、1mm厚なら200mm/minぐらいにすれば良いかと思ったのだが、余裕でカットできてしまったので、もう少し速度を上げても大丈夫かもしれない。
因みにLaserGRBLはラスターデータメインのソフトなので、カットの順番をセットできないから、本格的にレーザーカットを始めるならLightBurnを買った方が良いかな。
今のところは四角や丸に切るか、画像取り込みの彫刻しかしていないので、LaserGRBLでも問題ない。
問題があるとすれば、対象物をレーザーで焼くので、当たり前の事ながら煙と臭いが凄く出るから、屋内ではまともに作業する事ができない点だろう。特に火災報知器が設置されている場所では煙感知式だと間違いなく発報してしまうだろうし、樹脂や木材が焦げた臭いは、思いのほか長く室内に滞留するので、家族から忌み嫌われる事は確実だ。
住宅街やマンションのベランダでの作業でも臭いが隣近所に流れるので、何事かと思われるだろうし、レーザーカットそのものよりも作業環境づくりの方が大変かもしれない。
尚、今回カットしたアクリル板は、先日作成した7セグLED時計の表示パネルカバーとして使用。

鋸やカッターよりも精度が出ていて、切断面もかなり綺麗に切れたので、グレアのまま使ってみたのだけれど、やっぱり色々と反射して見え辛いかなぁ。見た目は綺麗なんだけど…

 

 

2022年12月6日火曜日

秋月電子通商 超大型4桁LED表示キット K-04380

超大型と書かれているが、先日作成した4インチ7セグLEDよりは小さい。
2.2インチの16セグLEDを7セグLEDとして利用する為の基板で、別売のマイコンデジタル時計キットと合わせて利用する前提の基板として販売されている。
2.2インチのアノードコモン16セグLEDは随分前にデジットで投げ売りされていた物を購入していて、長らく放置状態だった。
元々時計として使うつもり購入していたので、この秋月の基板もほぼ同時期に購入していたのだが、買って満足してしまって同様に放置状態。
放置される原因は概ね基板むき出しで使うのが嫌で、ケースを用意するのが面倒くさいからなのだけれど、ここ数年で3Dプリンターの利用環境が随分と良くなった事で積んだままの電子工作が捗るようになった。

今回はこの4桁LED表示キットを利用して、日付表示ユニットを作成する。まぁ、折角なのでボタンを押せば時計が表示できるようにはしておきたい。
基板の回路図は秋月の公式ページに書かれているので、そちらを参照すれば良い。
マイコンに関してはWeMOS D1 Miniの互換ボードを使用。

Arduino IDE上でのボード選択は「LOLIN(WEMOS)D1 R2 & mini」で問題無く動作した。USBのコネクターがType-Cになっているので、microUSBよりは抜挿への耐久性は期待できるかもしれない。
このボードはESP8266(ESP-12F)が使われているのでWiFiが利用できる。技適は通過しているのかどうかは分からないが、技適マークは無い。
既に無許可の海外製品だらけで汚れまくっている2.4GHz帯ではあるが、日本の法律では特定の条件を除いてFCCやCEやWi-Fi CERTIFIEDに通っていたところで、周囲に電波を出してはいけない事になっているから、電波を出す際にはその辺りを留意する事。
まぁ理屈だけで考えればアクセスポイントと繋いで使うのであれば、その周波数の波しか出ない訳で、技適に通っているAPを使って繋ぐ分には、何ら迷惑がかかる事は無いと思う。実際に計測したわけじゃないから想像でしかないけど。 たぶんUSB3.0の放射ノイズの方が酷い。

話が逸れた。今回の時計兼日付表示器の仕様としては、ESP8266を使ってNTPサーバーにアクセスして時刻を補正。 基本的に無線LANが繋がらない場所に持って行く予定は無いのでRTCは無し。 電源投入時とその後適当な間隔でNTPで時刻補正をかける事で対応する。
7セグLEDの制御はEPS8266で直接ドライブするにはピン数や電流量が足りないので、何故か10個程ストックしていたDIP仕様のTM1637というドライバーICを利用する。データシートはこちら

TM1637のDIP仕様はもう秋月では売っていなくて、amazonやaliexpressあたりで怪しげなのを買うしかない。国内流通在庫は探せばあるのかもしれないが面倒くさいので、素直にSOP仕様を購入するか、4桁までしか使わないなら、TM1630のDIP仕様を買った方が良いかもしれない。
ドライバーICを使うと抵抗とか考えなくても良くなるのが地味に有難い。

例によってラッピングワイヤーで繋ぐので、ピン配列だけ回路図で追いかけて、一覧表にまとめる。

LED_信号 TM1637 基板(K-04380) D1 mini
A 2 17  
B 3 18  
C 4 12  
D,月日LED-K 5 14  
E 6 13  
F 7 16  
G 8 15  
LED1,LED2-K 9 19  
DP   3  
DIG5(月日LED-A) 11 8  
DIG4,LED1-A 12 5,20  
DIG3 13 1  
DIG2 14 2  
DIG1 15 4  
GND 1   GND
VDD 16   5V
DIO 17   D1
CLK 18   D2
切替ボタン     D5

ドライバーICとマイコン間の接続は4芯だけなので楽だけど、ドライバーICと表示基板の間は結構接続ピン数が多い。

この秋月の基板で一か所に纏めてくれてるだけでも随分と有難いのだけれど…5台以上作るなら基板を作った方が良いかもしれない。

マイコンへのコーディングはいつも通りネット上に公開されているコードや既成ライブラリのサンプルコードのコピペ&改変。
esp8266のNTPを利用しての時間設定については、こちらのコードを拝借した。
先のページの解説によると、1時間に1回NTPサーバーに時刻を問い合わせているらしい。
今回利用したライブラリは「Seeed-Studio/Grove_4Digital_Display」と、前回に引き続き「ButtonEvents」。
Grove_4Digital_Displayについては、リンク先の説明を読めばわかるとおり、TM1637を利用した4桁7セグの時計ユニットを対象としたライブラリで、当然の事ながらそれが使いやすいような形になっているのだが、ライブラリ内の設定ファイル「TM1637.h」の最後の方に「const int DIGITS = 」という項目があって、利用桁数を変更できるようになっている。
今回はClockPoint(時計モードの際に0.5秒毎に点滅するアレ)とは別に月日表示の際にLEDを点灯させたいので、5桁目の適当なセグメントを利用する事にした。
このライブラリに付属しているClockDisplay.inoというサンプルプログラムの一部を利用してTM1637を制御する。
ClockPointの制御に関しては、DPセグメントをON/OFFしているので、秋月基板上のDPには接続せず、基板上のClockPoint(LED1,2)に接続する。
秋月基板のDPはLED4/LED6(時・分のそれぞれ一桁目)にしか接続されていないので月日表示の目印として使うには丁度良かったのだけれど、日付や時間を表示している際には、いずれのLEDも常時電圧が印加されているので、TM1637以外でGNDに落とす必要があって面倒くさかったので、別に2つLEDを用意して5桁目のアノードとDセグメントに接続した。
Dセグメントは7セグの下の横棒の事なので、5桁目を「1」や「8」に切り替えて点灯、消灯を制御している。
詳しい制御はコードを読んだ方が早いかもしれない。

#include Arduino.h
#include ESP8266WiFi.h
#include time.h
#include TM1637.h
#include ButtonEvents.h

#define WIFI_SSID   "hoge_ID"
#define WIFI_PASSWORD   "hoge_Pass"
#define JST     3600*9

#define ON 1
#define OFF 0

#define WAT 500 //ウェイト時間(ms)

// Define Digital Pins
#define CLK 4
#define DIO 5
TM1637 tm1637(CLK, DIO);

int8_t TimeDisp[] = {0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char ClockPoint = 1;
const int mdled_pin = 12; //月日LED
const int button_pin    = 14; //表示切替ボタン
unsigned char DispMode = 0;
unsigned long wattime;

ButtonEvents change_button;

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.print("\n\nReset:\n");

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while(WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println();
  Serial.printf("Connected, IP address: ");
  Serial.println(WiFi.localIP());
  configTzTime("JST-9", "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");   // 2.7.0以降, esp32コンパチ
  tm1637.init();
  tm1637.set(BRIGHTEST);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;
  tm1637.clearDisplay();
  pinMode(mdled_pin, OUTPUT);
  pinMode(button_pin, INPUT_PULLUP);
  change_button.attach(button_pin);
  change_button.doubleTapTime(200);
  change_button.holdTime(5000);
  wattime = millis();
}

void loop() {
  while((millis() - wattime)
    change_button.update();
    if(change_button.tapped() == true) {
      DMode();
    }
  }
  if(DispMode) {
    TimeUpdate();
  } else {
    DateUpdate();
  }
  tm1637.display(TimeDisp);
  wattime = millis();

  //time_t t;
  //struct tm *tm;
  //static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
  //t = time(NULL);
  //tm = localtime(&t);
  /*Serial.printf("ESP8266/Arduino ver%s :  %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
        __STR(ARDUINO_ESP8266_GIT_DESC),
        tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
        wd[tm->tm_wday],
        tm->tm_hour, tm->tm_min, tm->tm_sec);
        delay(1000); */
}

void TimeUpdate() {
  digitalWrite(mdled_pin, LOW);
  time_t t;
  struct tm *tm;
  t = time(NULL);
  tm = localtime(&t);
  ClockPoint = (~ClockPoint) & 0x01;
  if (ClockPoint) {
    tm1637.point(POINT_ON);
  } else {
    tm1637.point(POINT_OFF);
  }
    TimeDisp[0] = ((tm->tm_hour) / 10);
    TimeDisp[1] = ((tm->tm_hour) % 10);
    TimeDisp[2] = ((tm->tm_min) / 10);
    TimeDisp[3] = ((tm->tm_min) % 10);
    TimeDisp[4] = 1;
}

void DateUpdate() {
  digitalWrite(mdled_pin, HIGH);
  time_t t;
  struct tm *tm;
  t = time(NULL);
  tm = localtime(&t);
  tm1637.point(POINT_OFF);
    TimeDisp[0] = ((tm->tm_mon+1) / 10);
    TimeDisp[1] = ((tm->tm_mon+1) % 10);
    TimeDisp[2] = ((tm->tm_mday) / 10);
    TimeDisp[3] = ((tm->tm_mday) % 10);
    TimeDisp[4] = 8;
}

void DMode() {
    DispMode = (~DispMode) & 0x01;
}


各基板を収めるケースは手持ちの3Dプリンターでは一体形成品が印刷できなかったので、前回同様分割して印刷した。

今回は手抜きせずにマイコンボードを収める場所を作ったり、Type-Cのコネクターを繋いでメンテナンスができるように穴をあけたりしている。

なるべく高さを抑えたかったので、コンタクトピンを付けるにしても、高さを考えてカットする必要がある。

基板を作って直接実装してしまえば、あと3mmは追い込めるし、スッキリするから良いとは思うけれど、そこまでの完成度は求めていないからこの辺りが妥当なところだろう。
で、配線した基板とドライバーIC、ボタンスイッチをケースに入れて、グルーガンで固定。LEDが載ってる基板は更に4隅をネジ止めしておく。

あとはコレに適当な暗さのアクリル板を貼ってやれば、そこそこ見やすい時計&日付表示器になる。
因みに電源はType-CのコネクターからD1 mini互換ボードを経由し、D1 miniの5V出力をTM1637のVDDに接続している。 電流が足りるか分からなかったのだけれど、1週間以上動作させて問題無く動いているので、たぶん大丈夫なのだろう。
また、RTCを実装していないので、電源投入時に無線LANをつかみ損ねると暫く時計が初期化された状態で表示されるから、時刻補正されるまでは少し不安になるが、極力シンプルかつ安価に作りたかったので、我慢する事にしよう。

 

 

 

 

 

2022年11月27日日曜日

7セグメントLEDでカウンターの作成 その2

TPIC6C596がアノードコモン用のICなので、購入した7セグLEDも当然アノードコモンとなる。 ピン配列は購入したショップの説明欄に書かれていたので問題無かったのだけれど、セグメント毎のVf等のスペックが書かれていない。
で、色々と調べてみたら、共立電子に同じような商品が売られていたので、そちらを参考に実際に電圧を印加して確認した。結果A~Gは9V、DPは1.8Vだと思われる。今回DPを使う予定は無いけれど、TPIC6C596と接続するのであれば、リセット時等に電流が流れたりするので、それなりの制限抵抗を入れておかなければならない。
今回購入したTPIC6C596基板には最初から各セグメント毎に15Ωのチップ抵抗が実装されているが、もともと5インチ以上の7セグLEDでVf12V程度を想定している抵抗値なので、今回使用する4インチで使う場合は入力電圧自体を9V程度に収める必要があるし、そもそもDPには追加の制限抵抗が必須になる。
全部のセグメントに制限抵抗を追加するのは面倒くさいので入力電圧を調整する事で誤魔化す事にして、TPIC6C596基板を7セグLEDの背面に両面テープで張り付けてラッピングワイヤーで接続していく。

コンタクトピンが出ていてケーブルで接続する必要があり、行先がバラバラの場合という限られた条件では、ラッピングワイヤーは凄く便利だ。
半田付けすると故障時の部品の入替が面倒くさいし、ラッピングに比べて衝撃に案外弱い。まぁ、ラッピングも軸方向に引っ張れば抜けてしまったりするので、コンタクトピンが短すぎると使い難いところはある。
LEDの部分の作業はコレだけだ。配線距離が短いのは面倒が無くて助かる。 桁数を増やしたくなっても数百円のコントローラーボードとコントローラーボード間を繋ぐ為のケーブルを追加するだけで良いので、本当に有難い。
7セグLEDを保持する為のガワに関しては、3ユニットを収容できるような大きさの物を作れるような大きな3Dプリンターは持っていないし、持っていたとしても造形に失敗したら泣きそうなので、素直に1ユニット毎に作成する。

こうしておけば、後から桁数を増やしたくなった時に、中間ユニット用の保持部だけを作れば良い。
最初の造形物はLEDユニットの寸法通りに作成してしまって失敗。122mmの処を122mmで作れば当然入らない。印刷公差を考えて0.5~1.0mm程度は大きめに作る必要がある。ボタン取付用の穴も同様に0.5mm程度は大きくしておいた方が無難かもしれない。
まぁ、丸穴は最悪ドリルで拡張すれば良いので、0.2mm程度大きめの穴を開ければ使い物になるかも。
で、7セグLED保持部だが、内壁を0.5mm拡張しようとするとフライス盤で削るという方法が考えられるのだけれど、今回はインフィル充填率50%で作っているので、壁面を削ってしまうと強度的に問題が有りそうだ。
データを修正して作り直す方がフライス盤で修正するよりも面倒が無いし、その方が出来栄えも綺麗なので結局作り直すことにした。
しかし、所詮ホビー用の3Dプリンターなので1個作るのに9~12時間かかるのが辛い。
初回試作でボタン位置やケーブル通し溝に問題がある事が判明したので、無駄にはならなかったと思いたい。
こういう時にだけKP3Sぐらいの小さい3Dプリンターがもう一台欲しくなる。
総印刷時間に20時間以上かけて3桁分のケースを印刷しなおして7セグLEDを実装する。固定は全て両面テープ。

幅1mmのアクリル両面テープは携帯電話分解組み立ての際に裏蓋を固定する為に購入した物だが、ヒケの出ない接着剤として使用するのに便利で、今回の工作の際にもLEDの固定やケースとアクリル板を固定する際に大変役立っている。

アクリル板は元は普通のスモークの物だったが、それだとアクリル板を貼る前と大して見栄えが変わらなかったので、400番のペーパーを当てて摺ガラス調にする事でLEDの明かりがソフトになり、消灯しているセグメントやケース内の適当な配線や工作を見えにくくなった事で数字の視認性が良くなった。

電源に関しては10VのACアダプターを使用して、ATtiny88のVin及びTPIC6C596の12Vに入力する事で、7セグLEDのDP以外は制限抵抗の追加は無しとした。

5V系はATtiny88の5Vからの出力で全て賄う事ができている。
そんな感じのやっつけ電源なので、間違って12VのACアダプターを使ってしまうと、7セグLEDは壊れるかもしれない。
とりあえず半年程連続稼働させて問題なければ、そのまま継続使用しても大丈夫かなぁ…

 

 

 

 

 

 

2022年11月8日火曜日

7セグメントLEDでカウンターの作成 その1

4インチの7セグLEDを3つ使用してカウンター表示器を作成した。
といっても、昔の用にシフトレジスターを論理回路でゴチャゴチャする必要が無いので、作るのは非常に簡単だ。
今回作成したのは大型の7セグLEDを3つ並べて使用する物なのだけれど、将来的に4桁必要になるかもしれないという事から、1桁毎にTPIC6C596を取り付けて、このLEDドライバーをチェーン接続するという方式を取った。

この7セグLEDドライバー1つで制御できるのは一桁だけなのだが、これをディジーチェーンすると、いくらでも桁数を増やす事ができる。
カウンターの制御は当初Arduino nanoを使う予定だったのだが、既にヘッダピンを下向きに半田付けしてしまっていて、組み込みにくかった事と、最近Arduinoが互換品でもそれなりの値段になっていて(ヘタするとESP8266やEPS32のボードの方が安いぐらい)、使うのが勿体なかったので、

他に何か良いのが無いかと探してみた処、AtmelのATtiny88を見つけた。

このマイコンボード、実はnanoと勘違いして購入してしまった代物で、届いてからArduino nanoとは全く別物だと気づいて愕然としていたのだけれど、調べてみるとArduino IDEが使えるし、Vinや5Vout、EEPROM等、今回のカウンター作成で使いたい機能は一通り揃っていたので、試しに使ってみる事にした。
microUSB-Bのポートは付いているものの、USB制御チップが乗っていないので、シリアルで書き込みしないと駄目かなぁと思ったら、V-USBという仕組みを採用しているらしく、PCにドライバーを入れれば容易に認識した。
ArduinoIDEで使う際は、コンパイル後、ファームウェアを転送し始めたらPCとATtiny88をUSBケーブルで繋ぐ、もしくはATtiny88のリセットボタンを押してリブートするといった作法が必要になるけれど、慣れればCOMポートの設定も必要ないし便利といえば便利かもしれない。
カウンターのプログラムは多分に漏れず他人の書いたコードのコピペで、それを元にして実装したい機能に合わせてライブラリを追加したり、足りない部分や辻褄合わせの為のコードを追記していく。 Arduinoの良い処は既に安定して動作するライブラリを他人様が無料で提供してくれているところだろう。そして、ハードウェアレベルのロジックを考えなくても大抵の事ができてしまう。
何故そうなるのかといった理屈は知っておいた方が良いとは思うが、昔みたいにオシロを持ち出して波形なんて眺めなくても、電卓とスペックシートとプログラミング環境(とインターネットの集合知)があれば、ショボい電子工作なら素人でも手が出せるようになっているので、間口は無茶苦茶広くなっている。
凝った事をしたくなったら、基板の作成は安価に出せるようになってるし、機構や外装には3Dプリンターが使えるので、これもハードルが低い。
コードは以下の通り。


#include EEPROM.h
#include ButtonEvents.h

//GPIO declarations
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
byte segmentClock = 4;
byte segmentLatch = 5;
byte segmentData = 3;
const int up_pin    = 6; //カウントアップボタン
const int down_pin  = 7; //カウントダウンボタン
const int reset_pin = 1; //リセットボタン
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

ButtonEvents up_button; // create an instance of the ButtonEvents class to attach to our button
ButtonEvents down_button;
ButtonEvents reset_button;

int number   = 0;
int segnumber= 0;
int button_pt = 0;
char sp = ' ';

void setup()
{
  Serial.begin(9600);
  Serial.println(EEPROM.length());
  Serial.println("Large Digit Counter ver.1.0");

  pinMode(segmentClock, OUTPUT);
  pinMode(segmentData, OUTPUT);
  pinMode(segmentLatch, OUTPUT);
  pinMode(up_pin, INPUT_PULLUP);
  pinMode(down_pin, INPUT_PULLUP);
  pinMode(reset_pin, INPUT_PULLUP);

  digitalWrite(segmentClock, LOW);
  digitalWrite(segmentData, LOW);
  digitalWrite(segmentLatch, LOW);
  EEPROM.get(0x00,number);

  // attach our ButtonEvents instance to the button pin
  up_button.attach(up_pin);
  down_button.attach(down_pin);
  reset_button.attach(reset_pin);

  //ButtonParameter Setup
  //ダブルタップ制限時間(ms)
  up_button.doubleTapTime(200);
  down_button.doubleTapTime(200);
  reset_button.doubleTapTime(200);
  //長押し判定時間(ms)
  up_button.holdTime(5000);
  down_button.holdTime(5000);
  reset_button.holdTime(5000);
}

void loop()
{
  //アップボタン(シングルタップ +1, ダブルタップ +10)
  up_button.update();
  if(up_button.tapped() == true) 
  {
    EEPROM.put(0xf0,number); //カウンター数字バックアップ
    number++;
    number %= 1000; //Reset x after 999
    EEPROM.put(0x00,number);
  }
  if(up_button.doubleTapped() == true)
  {
    EEPROM.put(0xf0,number); //カウンター数字バックアップ
    number = number + 10;
    number %= 1000; //Reset x after 999
    EEPROM.put(0x00,number);
  }

  //ダウンボタン(シングルタップ -1, ダブルタップ -10)
  down_button.update();
  if(down_button.tapped() == true)
  {
    EEPROM.put(0xf0,number); //カウンター数字バックアップ
    number--;
    if(number < 0) 
    {
      number = number + 1000;
    }
    number %= 1000; //Reset x after 999
    EEPROM.put(0x00,number);
  }
  if(down_button.doubleTapped() == true)
  {
    EEPROM.put(0xf0,number); //カウンター数字バックアップ
    number = number - 10;
    if(number < 0) 
    {
      number = number + 1000;
    }
    number %= 1000; //Reset x after 999
  }

// リセットボタン(長押し リセット, ダブルタップ リストア)
  reset_button.update();
  if(reset_button.held() == true) //リセットボタン長押しでリセット
  {
    EEPROM.put(0xf0,number); //カウンター数字バックアップ
    number = 0;
    EEPROM.put(0x00,number);
  }
  if(reset_button.doubleTapped() == true) //リセットボタンダブルタップでリストア
  {
    EEPROM.get(0xf0,number); //カウンター数字リストア
    EEPROM.put(0x00,number);
  }

//  Serial.println(number);
  showNumber(number);
}

//Takes a number and displays 3 numbers. Displays absolute value (no negatives)
void showNumber(float value)
{
  segnumber = number ;
  int segnumber = abs(value); //Remove negative signs and any decimals
  Serial.print("number: ");
  Serial.println(segnumber);
  for (byte x = 0 ; x < 3 ; x++) //桁数決定
  {
    if ((x > 0) && (segnumber == 0)) //下2桁目以上が0の場合スペース
    {
      postNumber(sp, false);
    }
    else
    {
      int remainder = segnumber % 10; //各桁の数字を抽出
      postNumber(remainder, false); //1桁ずつ送信
      segnumber /= 10;
    }
  }

  //Latch the current segment data
  digitalWrite(segmentLatch, LOW);
  digitalWrite(segmentLatch, HIGH); //Register moves storage register on the rising edge of RCK
}

//Given a number, or '-', shifts it out to the display
void postNumber(byte segnumber, boolean decimal)
{
  //    -  A
  //   / / F/B
  //    -  G
  //   / / E/C
  //    -. D/DP

#define a  1<<0
#define b  1<<6
#define c  1<<5
#define d  1<<4
#define e  1<<3
#define f  1<<1
#define g  1<<2
#define dp 1<<7

  byte segments;

  switch (segnumber)
  {
    case 1: segments = b | c; break;
    case 2: segments = a | b | d | e | g; break;
    case 3: segments = a | b | c | d | g; break;
    case 4: segments = f | g | b | c; break;
    case 5: segments = a | f | g | c | d; break;
    case 6: segments = a | f | g | e | c | d; break;
    case 7: segments = a | b | c; break;
    case 8: segments = a | b | c | d | e | f | g; break;
    case 9: segments = a | b | c | d | f | g; break;
    case 0: segments = a | b | c | d | e | f; break;
    case ' ': segments = 0; break;
    case 'c': segments = g | e | d; break;
    case '-': segments = g; break;
  }

  if (decimal) segments |= dp;

  //Clock these bits out to the drivers
  for (byte x = 0 ; x < 8 ; x++)
  {
    digitalWrite(segmentClock, LOW);
    digitalWrite(segmentData, segments & 1 << (7 - x));
    digitalWrite(segmentClock, HIGH); //Data transfers to the register on the rising edge of SRCK
  }
}


参考というか、ほぼコピペさせて頂いたサンプルプログラムはsparkfunのLarge Digit Driver Hookup Guideにある「Example:Two Large Digits
使用させて頂いたライブラリは
ButtonEvents
とそれに付随する
Bounce2
というわけで、これらをとりあえずブレッドボードで接続して動作させた処、問題無く動作したので、実装を進めていく。

ちなみに、ATtiny88TPIC6C596はamazonで購入すると、安かったり高かったりとなかなか値段が安定しないので、aliexpressで売られている価格と比較すれば良いと思う。ATtiny88はAliexpressに近い値段で売られている事が多いが、TPIC6C596は値差が大きい気がする。

 

 

 

2022年11月5日土曜日

Cygnus-X パンク修理失敗とタイヤ交換 ODO 35557km

シグナスの前後輪共にスリップサインが出て久しいのだが、面倒くさくてタイヤ交換をしていなかった。
久々に後輪を眺めながら手でくるくると回していると釘を踏んでいたので、パンクしなければ良いなぁと思いながら引っこ抜いたところ、手で触れて分かるような空気漏れは無かったので大丈夫かなぁと思っていたら、3時間後には見事にパンクしていた。

で、前回のリベンジということで、スティックタイプのパンク修理キットを持ち出して、修理してみたのだが、あえなく惨敗。 リークテスターでは分からない程度のエアー漏れなんだけど、数時間したら空気が抜けてしまう。

うーん、ゴムスティックがベタベタになっているので、それが駄目なんだろうか? でも買った時からこんな感じだしなぁ。
まぁ、駄目元で修理してみただけなので、そもそもタイヤの交換時期だったという事もあって、素直に新しいタイヤに交換する事にした。
パンクで敢無くお役御免となったIRCのSCT-001は結局10300km程の寿命だった。スリップサインが出たのはもう少し前で9千キロぐらいかな。パンクさえしなければ、あと千キロぐらいは使っていたと思われる。前回のタイヤ交換が2019年12月なので、凡そ3年弱使用したにも関わらずサイドウォールのひび割れが見られない事を考えると、結構優秀なタイヤだと思う。
前輪で使用していたIRCのMB67の使用距離は20700km程。交換頻度としては、前輪1回につき後輪は2回といった感じなのかな。こちらもスリップサインは1.8万キロぐらいには露出していたと思うが、結局2万キロ超まで使用してしまった。たぶん今回のパンクがなければ、あと千キロぐらいは使っていたと思う。 このタイヤの交換は2016年12月なので、6年弱使用した。

流石にこれだけ長期間使用するとサイドウォールに微細なひび割れが見られるが、実家の屋外保管されているスクーターに比べれば微々たるものだ。 やはりタイヤを保管するのに直射日光は大敵という事なんだろう。

今回購入したタイヤはDUROのHF-912A(前輪)とDM-1017(後輪)。

DUROのタイヤは母親のスクーターで使用していた際には経年劣化によるひび割れが目立つタイヤだったが、屋内保管なので、アレ程酷くはならないと思いたい。まぁ安いタイヤなので、1万キロ弱もってくれれば御の字かな。
後輪のタイヤ交換はマフラーやスイングアームの取り外しが面倒臭いだけで、タイヤサイズ的には脱着しやすい。古いタイヤを外して、新しいタイヤを取り付け、エアー漏れが無いかリークチェッカーで確認したところ、ビードとリムの隙間から微妙に漏れているっぽい。
 
このタイヤ、送料を無料にする為の価格調整用に購入したから、長らく放置状態だったので、ビード部分の密着が悪くなっているのかもしれない。そんなことがあり得るのか分からないけど… ビードもリムも傷は無さそうなので、エアー漏れする原因がわからない。

全然エアー漏れしていないところにはリムに傷があったけれど。

とりあえずビードシーラーを塗り付けて誤魔化したところエアー漏れは無くなったので、しばらく様子を見る事にする。

後輪を交換するついでにドラムブレーキシューも交換しようとしたところ、シューとホイールが干渉してしまいホイールが挿入できなかったので、「この中華品質め」と愚痴りながら、元のシューに戻してホイールを取り付け。

で、今、写真をよくよく見てみたら中華シューの取り付けが裏表逆だった。これがホイールがハマらなかった原因なのかもしれないので、次回のタイヤ交換まで中華シューは捨てずに置いておこう。

次に前輪のタイヤ交換。 タイヤサイズの問題なのか、後輪に比べて脱着が非常にやりにくい。とにかく硬い。ブレーキディスクが邪魔で作業性が悪いのもあるが、とにかくタイヤが後輪よりも硬く感じる。
こちらのタイヤも後輪と同じく送料無料の価格調整用に購入した為、購入してからそれなりに時間が経過している。後輪と同じく新しいタイヤを装着し終わってからリークチェッカーで確認したところ、ビードとリムの間から微細なエアー漏れ。 同様にビードシーラー塗布で胡麻化してエアー漏れは止まったので、こちらもしばらく様子見。
前輪タイヤ交換のついでに、ブレーキディスクの摩耗が進んでいたので、こちらも交換しておく。

本来はディスクを固定するボルトも新品にすべきなのだけれど、今回は再使用する事にした。特に理由は無く単純に注文し忘れただけ。

中華の安物のディスクだが、そんなにブレーキを酷使するようなバイクではないので、問題は無いと思う。 耐摩耗性がどれぐらいあるのかは使ってみなければ分からない。純正のディスクとの値段差が大きすぎるので、多少問題があったとしても許容できるかな。
amazonの評価では平面が出ていないとか、止まらないとか書かれていたけれど、今回購入したものは特に問題は無かった。
まぁ平面が出ていなければ、止まらないだろう。 平面が出ているのに止まらないのは、ディスク取り付け前に脱脂するのを忘れてるか、パッドとの相性が悪いんじゃないかな。

タイヤ交換が終わって軽く試走してみた感想としては、前輪の動きが鈍重。やはりIRCのタイヤに履き替えた際の感想は正しかった。
直減りしたIRCのタイヤよりも軽快感が無いとは思わなかった。ちゃんと入力してやれば普通に曲がるし、グリップ感が無い訳ではないので、単純にタイヤ形状によるフィーリングの違いか。 こればかりは好みの問題だろうから、慣れれば問題無いだろう。
後輪に関しては、いつも通り違いが分からない。路面が濡れてたりすればグリップとか排水性が気になるのかもしれない。

ODO 35557km