続いて、イベント「RFCダイヤ運転フェスタ2022春」に行ってきました。
こちらも面白いイベントでしたね。
配線はやはりすさまじい量。
この車庫にはポイント切り替え用の配線が見当たらず、
DCCデコーダーは道床に内蔵しているのでしょうか?
DCC線路でうまく閉塞区間を作って在線検知する仕組みは、
こちらのツイートに説明がありました。
以上です。
続いて、イベント「RFCダイヤ運転フェスタ2022春」に行ってきました。
こちらも面白いイベントでしたね。
配線はやはりすさまじい量。
この車庫にはポイント切り替え用の配線が見当たらず、
DCCデコーダーは道床に内蔵しているのでしょうか?
DCC線路でうまく閉塞区間を作って在線検知する仕組みは、
こちらのツイートに説明がありました。
以上です。
鉄道模型について今後の取り組みのヒントを得ようと、
イベント「第7回 池袋鉄道模型芸術祭」に行ってきました。
主な視点はレイアウトの裏側にあるケーブルの配線。
規模が大きくなるとどうしてもごちゃごちゃしているんですよね。
あとはジオラマ。本当にすごい。
こういうジオラマを作れるようになりたいものです。
以上です。
以前、「M5StickCによるJJY Simulatorで電波時計の時刻を設定」という記事を
書きましたが、今回はパソコンから USBシリアル変換モジュールを使って
JJY模擬信号を出力する JJY Simulatorを製作しました。
製作途中に下記の動画を見つけてしまい、
結果的に後追い記事みたいになってしまいました…。
UARTで電波時計を同期させる FakeJJY - ニコニコ動画 (nicovideo.jp)
■ 部品表
まずは部品表と完成写真です。
| 記号 | 員数 | 品名 | 品番 | コード |
|---|---|---|---|---|
| L1 | 1 | 八ヶ岳クラブ 小型バーアンテナコイル 340uH | MM-B-ANT 340UH | 千石電商 |
| C1,C2 | 2 | 絶縁ラジアルリード型積層セラミックコンデンサー 0.1uF 50V | RD15W104K1HL2L | 秋月 P-04064 |
| R1 | 1 | 金属皮膜抵抗 1kΩ 1/4W | MFS25F1KB | 秋月 R-08535 |
| PCB | 1 | 16ホール ユニバーサル基板 (2.54mm) | Board 1 16holes | 秋月 P-02515 |
| CN | 1 | ピンヘッダ(オスL型) 1x40 | PH-1x40RG(2) | 秋月 C-01627 |
| CN | 1 | ピンソケット(メス) 1x4 | FH-1x4SG/RH | 秋月 C-10099 |
| - | 1 | FT234X 超小型USBシリアル変換モジュール | AE-FT234X | 秋月 M-08461 |
| - | 1 | GROOVY USB Type Aオス - Micro Bオス 変換コネクタ | GM-UH010 | ヨドバシ |
バーアンテナコイルは、秋葉原にある千石電商の店舗で偶然見つけたもので、
せんごくネット通販では見つかりませんでした。
■ アンテナ回路
送信したいJJYの周波数が 40kHzで、アンテナコイルのインダクタンスが 340uHですので、
共振周波数の計算式 f=1/(2*PI*sqr(L*C)) より、必要な
キャパシタンスは C=1/((2*PI*f)^2*L)=1/((2*PI*40kHz)^2*340uH)≒0.0466uF になります。
ただ手持ちのコンデンサが 0.1uFしかなかったため 2個直列にして約0.05uFにしました。
また、FT234XDチップの TXDポート出力電流が最小設定で Max 4mAですので
直列に 1kΩの抵抗を追加しました。
LTspiceでシミュレートすると、下記のようなインピーダンス周波数特性になりました。
ADALM2000 Scopyで実測すると、下記のようなインピーダンス周波数特性になり、
シミュレーションとほぼ同じ結果となりました。
■ パソコンソフト
USBシリアル変換モジュールの UART通信設定は、
・ボーレート: 80 kbps (2ビットで 40kHzとするため 2倍となる)
・データ長: 8 ビット
・パリティ: なし
・ストップビット: 1 ビット
になります。
データとして 0x55 を 1バイト送信すると、スタートビットとストップビットを含めて
125usの時間で 0/1が 5回繰り返されることになります。
800バイト連続で送信すると 0.1s(=125us*800)になりますので、これを 1セットとして、
JJYのパルス幅 0.2/0.5/0.8sに応じて 2/5/8セットを送信します。
プログラムはPowerShellスクリプトで作成しました。
当初は、1パルス毎に 1回の wirte()で済むように、
0.2s:1600バイト、0.5s:4000バイト、0.8s:6400バイトを送信するように作ったのですが、
FT234Xドライバの制約なのか分かりませんが、4000バイト程度を超えるデータが
なぜか実際には送信されず消失してしまうので、0.1sずつ write()を分けるようにしました。
本当に0/1が全部連続しているかは未確認ですが、
電波時計で受信する分にはおそらく問題ないでしょう。
# Out-SerialPortJJYSimulator.ps1
Write-Host "JJY Simulator with Serial Port"
if ($portName -notmatch "COM\d+") {
Write-Host ("Serial Port Names: " + [System.IO.Ports.SerialPort]::GetPortNames() -join ",")
$portName = Read-Host "Enter Port Name"
}
$codeName = @(
" M", " 40m", " 20m", " 10m", " 0", " 8m", " 4m", " 2m", " 1m", " P1",
" 0", " 0", " 20h", " 10h", " 0", " 8h", " 4h", " 2h", " 1h", " P2",
" 0", " 0", "200d", "100d", " 0", " 80d", " 40d", " 20d", " 10d", " P3",
" 8d", " 4d", " 2d", " 1d", " 0", " 0", " PA1", " PA2", " SU1", " P4",
" SU2", " 80y", " 40y", " 20y", " 10y", " 8y", " 4y", " 2y", " 1y", " P5",
" 4w", " 2w", " 1w", " LS1", " LS2", " 0", " 0", " 0", " 0", " P0"
)
$baudRate = 40000 * 2
$pulseTime = @{ "M" = 2; "P" = 2; "1" = 5; "0" = 8 }
$pulseData = [byte[]](@([byte]0x55) * ($baudRate / 10 / 10))
try {
$serial = New-Object System.IO.Ports.SerialPort $portName, $baudRate, None, 8, One
$serial.WriteBufferSize = $pulseData.Length
$serial.WriteTimeout = 1000
$serial.RtsEnable = $true
$serial.Open()
$date = Get-Date
$second = $date.Second
$code = $null
while ($true) {
while ($second -eq $date.Second) {
Start-Sleep -Milliseconds 1
$date = Get-Date
}
$second = $date.Second
if (($second -eq 0) -or ($null -eq $code)) {
$code = @(
"M",
($am = [System.Convert]::ToString(
([System.Math]::Truncate($date.Minute / 10) -shl 5) +
($date.Minute % 10), 2).PadLeft(8, "0")),
"P00",
($ah = [System.Convert]::ToString(
([System.Math]::Truncate($date.Hour / 10) -shl 5) +
($date.Hour % 10), 2).PadLeft(7, "0")),
"P00",
[System.Convert]::ToString(
([System.Math]::Truncate($date.DayOfYear / 100) -shl 5) +
([System.Math]::Truncate($date.DayOfYear / 10) % 10), 2).PadLeft(7, "0"),
"P",
[System.Convert]::ToString(($date.DayOfYear % 10), 2).PadLeft(4, "0"),
"00",
(($ah -replace "0").Length % 2),
(($am -replace "0").Length % 2),
"0P0",
[System.Convert]::ToString(
(([System.Math]::Truncate($date.Year / 10) % 10) -shl 4) +
($date.Year % 10), 2).PadLeft(8, "0"),
"P",
[System.Convert]::ToString([int]$date.DayOfWeek, 2).PadLeft(3, "0"),
"000000P"
) -join ""
Write-Host "Time Code: $(
$code.Insert(50, " ").Insert(40, " ").Insert(30, " ").Insert(20, " ").Insert(10, " "))"
}
$codeValue = [string]$code[$second]
Write-Host "$($date.ToString("yyyy/MM/dd HH:mm:ss")) -> $($codeName[$second]) : $codeValue"
for ($i = 0; $i -lt $pulseTime[$codeValue]; $i++) {
$serial.Write($pulseData, 0, $pulseData.Length)
}
}
} catch {
Write-Warning ($_ | Out-String)
} finally {
$serial.Close()
}
■ 電波時計で受信
実際に電波時計をアンテナコイルから離して受信させたところ、
・約1m … 問題なく時刻が設定された。
・約2m … 電波時計の電波強度表示は大きくなるものの設定されず。
・約3m … 電波時計の電波強度表示は低いままで設定されず。
という結果になりました。
もう少し正確にアンテナマッチングを行えば、
より長い距離でも受信できるかもしれませんが、ここで終わりにしたいと思います。
市販されている微弱無線の電波時計用リピーターの製品仕様を見ると、
長くて距離10mくらいのようですので、その辺りが微弱無線の上限と思われ、
超えないようにしなければなりません。
以上です。
秋月電子で売られているマイクロサーボ SG-90 [M-08761]の歯車に取り付ける
サーボホーンの内歯車を3Dプリンタで作りました。
「SG90 3Dプリンタ」でGoogle検索したところ、
「【SG-90サーボモーター】サーボホーンの歯を3Dプリンタで再現出来るってすごいですね!」
という記事が見つかりまして、これを参考にしました。
まずは、適切な寸法を見つけるために、
内歯車の内接円の直径を4.4~4.9mm、外接円の直径を4.6~5.3mmの範囲で
0.1mmステップで組み合わせたデータをFreeCADで作りました。
それを光造形3Dプリンタで作成しました。
サーボの歯車を穴にはめて確認したところ、
内側4.7mm・外側5.2mmの内歯車が、
少し強く押すとパチッとはまる程度になり、緩みもなくちょうどよいことが分かりました。
STLファイルをzip圧縮して偽装pngファイルに変換してアップしました。
EDGEで下の画像枠(中身は表示されていないかもしれませんが)を右クリックして
→ 「新しいタブで画像を開く」 → アドレスの末尾の「?caw=800」を削除
→ 「名前を付けて画像を保存」 → pngファイルを保存
→ 拡張子をzipに変更して解凍 → 「GearForServoSG90.stl」ファイルが得られます。
以上です。
ATtiny412マイコンを使った DCCポイントデコーダー基板を車両に乗せて
鉄道模型デモをしようとしていたのですが、DCCコマンドを送っても無反応になる
現象が頻繁に発生して、どうも動作が安定せず困っていました。
それで安定化電源から給電して確認したところ、
・出力電圧を予め12Vに設定してから電源ON → 正常に動作
・0Vで電源ONしてから電圧を12Vまで上げる → 動作不良
となることが分かりました。
つまり、低い電圧でリセットが解除されてマイコンが動き出し、
動作周波数に対応する電源電圧の条件を満たさない状態で
ファームがクロック周波数を 20MHzに設定しているため、
マイコンが暴走しているらしいことが分かりました。
改めてデータシートやを確認すると、Microchip社の
AN2747 「Robustness on tinyAVR 1-Series」という資料に、
「3. Brown-out Detector」という記載があり、
BODレベル設定が必要なことが分かりました。
具体的には BODCFG.LVLをデフォルトの 1.8Vから 4.2Vに変更する必要があり、
実際に設定すると、
安定化電源で電圧を 0Vからゆっくり上げても正常に動作するようになりました。
次は実際の車両で試したいと思います。
以上です。
以前の記事「ATtiny416 Xnanoボードの mEDBGファーム更新」に続いて、
今回は ATtiny104 Xplained Nanoボードの mEDBGファームを UPDI用に更新して
UPDIライタを製作しました。
ATtiny104 Xplained Nanoボードの方が秋月電子で入手できてハードルが低いかなと
思ったのですが、いつのまにか販売終了してしまったようですね。
更新手順は基本的に ATtiny416 Xplained Nanoボードと同じですが、
1点異なるのは、「medbgupdi.bin」ファイルの名前を「medbgtpi.bin」に変えて
zipファイルにパックする必要があることだけです。
おそらく ATmega32U4マイコンの中に ID情報(0xFD)が書き込まれていて、
それを元に「avrtools_fw.xml」ファイルから「medbgtpi.bin」ファイルが指定される
仕組みになっているのではと推測しています。
それでボードの回路図を見ると、UPDI信号はPE6ポート(1ピン)に割り当てられて
いることが分かりますので、そこから線を引き出す必要があるのですが、
パターン図を見ると近くのテストパッドにつながっていますので、これを利用します。
使いやすいように、
GND線(黒色)と UPDI線(白色)をピンソケットに接続するのですが、
UPDI線には保護用として 4.7kΩ抵抗を直列に入れます。
下の写真は配線後のものです。
おなじみの ATtiny412マイコンを使った DCCポイントデコーダー基板に接続して、
特に問題なく VSCode+PlatformIOからファームを書き込むことができました。
以上です。
前回の水槽用LEDライトコントローラで、
白色点灯→青色点灯の遷移途中が少し暗めであったため、
この遷移期間はデューティー比が合計100%になるように調整して改善しました。
また、動画を撮ろうしたらフリッカーが酷かったので、
波形を測定したところ周期が約116Hzでした。
digitalWrite()関数の動作が非常に遅いことが分かりました。
そこで、PWMの周期を1000→100カウントにしたら約1.13kHzに改善し、更に、
digitalWrite()関数の代わりにポート直接制御(PORTA.OUTSET/OUTCLR)にしたら
約8.83kHzに改善しました。
ただせっかくなので前回少し触れたタイマーTCAを使うことにしました。
少しハマったのが、tinyAVR1用のArduinoライブラリ(megaTinyCore)は
マイコン起動時にタイマーTCAをSPLITモードに設定してしまうので、
元に戻すために takeOverTCA0()関数を呼び出す必要があることです。
プリスケーラを2分周にして周期は約10.1kHzにしました。
これで一旦完成としたいと思います。
動画です。実際の見た感じはもう少し明るいです。
動画撮影中、デジカメのAE/AF LOCKボタンを押し続けているため少しブレています。
ソースコードです。
//------------------------------------------------------------------------------
// Light Stick Controller
//
// Arduino IDE Configuration
// Preferences: http://drazzy.com/package_drazzy.com_index.json
// Board Manager: megaTinyCore by Spence Konde
// Board: ATtiny412/402/212/202
// Chip: ATtiny412
// Programmer: Xplained Mini (mEDBG, debug chip: ATmega32u4)
// ATtiny416 Xplained Nano (ATTINY416-XNANO) Evaluation Kit
//
// Microchip ATtiny412-SSN (8-Pin SOIC)
// Pin Signal Function | Pin Signal Function
// 1: VDD +5V | 8: GND GND
// 2: PA6 VREF DAC0.OUT | 7: PA3 N.C.
// 3: PA7 LED2 TCA0.WO0 | 6: PA0 UPDI UPDI
// 4: PA1 LED1 TCA0.WO1 | 5: PA2 ADC0 ADC0.AIN2
//
//------------------------------------------------------------------------------
#define PIN_LED1 PIN_PA1
#define PIN_LED2 PIN_PA7
#define PIN_VREF PIN_PA6
#define PIN_ADC0 PIN_PA2
const uint16_t TCA_PER = 1000;
const uint16_t TCA_CMP[] = {
0, 9, 18, 30, 43, 59, 77, 98, 122, 150,
183, 221, 265, 316, 376, 445, 526, 619, 728, 854,
1000, 990, 975, 954, 924, 884, 831, 764, 685, 595,
500, 405, 315, 236, 169, 116, 76, 46, 25, 10,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
const uint16_t INDEX_SIZE = sizeof(TCA_CMP) / sizeof(TCA_CMP[0]);
void setup() {
// PORT
pinMode(PIN_LED1, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
pinMode(PIN_VREF, OUTPUT);
digitalWrite(PIN_LED1, LOW);
digitalWrite(PIN_LED2, LOW);
digitalWrite(PIN_VREF, HIGH);
// TCA (16-bit Timer/Counter Type A)
takeOverTCA0();
PORTA.PIN7CTRL |= PORT_INVEN_bm;
PORTMUX.CTRLC |= PORTMUX_TCA00_ALTERNATE_gc;
TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV2_gc;
TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_SINGLESLOPE_gc | TCA_SINGLE_CMP1EN_bm | TCA_SINGLE_CMP0EN_bm;
TCA0.SINGLE.PER = TCA_PER;
TCA0.SINGLE.CMP1 = 0;
TCA0.SINGLE.CMP0 = TCA_PER;
TCA0.SINGLE.CTRLA |= TCA_SINGLE_ENABLE_bm;
}
uint16_t m_index = INDEX_SIZE;
uint16_t m_hysteresis = 2;
unsigned long m_millis = 0;
void loop() {
if ((millis() - m_millis) >= 100) {
uint16_t adc = analogRead(PIN_ADC0) + m_hysteresis;
uint16_t index = (adc * INDEX_SIZE) / (1024 + 4);
if (index != m_index) {
m_hysteresis = ((index > m_index) ? 4 : 0);
TCA0.SINGLE.CMP1 = TCA_CMP[index];
TCA0.SINGLE.CMP0 = TCA_PER - TCA_CMP[(INDEX_SIZE - 1) - index];
}
m_index = index;
m_millis = millis();
}
}
以上です。
DCCポイントデコーダー基板を使って水槽用LEDライトコントローラーを作成しました。
回路のブロック図を示します。
以前の踏切の警報音ではモータードライバの先にスピーカを接続しましたが、
今回は白色と青色の COB LEDモジュール 120mm 48チップ (12V)を接続しました。
また、調光操作用に可変抵抗器(ボリューム)をマイコンのA/D入力ポートに接続しました。
LEDは白色と青色をそれぞれ制御できるようにしたいので、本来は
両方を同時にONできないフルブリッジのモータードライバは適当ではないのですが、
DCCポイントデコーダー基板をそのまま使うことを優先しました。
ただ、白色と青色のON時間のデューティー比が合計100%以内であればよいので、
実用上は意外と大きな制約にはなりませんでした。
調光操作は、無段階(実際にはA/Dコンバータの1024段階)にしようとすると
べき乗の計算が必要になり困難なため、
20段階にしてデューティー比をテーブルで持つようにしました。
またボリュームが1個のため、実際には消灯→白色点灯→青色点灯→消灯、
の制御ができるように 61段階にしました。
それで、製作した基板の写真です。
aitendoのDCジャックwith基板 [JPCB-DC2155-2P] をベースにして、
DCCポイントデコーダー基板を取り付けて、
秋月電子の小型ボリューム 10kΩB [P-15219] と
ターミナルブロック 緑色 2P [P-14217] を取り付けました。
それを aitendoのケース [2P-J39](廃番?) に入れました。
COB LEDモジュールは、ダイソーのステンレストレー(小)に取り付けて配線しました。
放熱と横方向への光漏れ防止を兼ねています。
ATtiny412マイコンのソースコードです。
調光の単機能のみですので、簡略化のためPWMはソフト制御にしました。
白色と青色は同時ONできないため、ON期間については、
一方は一周期の最初からカウントし、もう一方は最後からカウントするようにしています。
タイマーTCAを使う場合は、一方のI/Oピン構成を反転出力(INVEN=1)にすれば
実現できると思います。
//------------------------------------------------------------------------------
// Light Stick Controller
//
// Arduino IDE Configuration
// Preferences: http://drazzy.com/package_drazzy.com_index.json
// Board Manager: megaTinyCore by Spence Konde
// Board: ATtiny412/402/212/202
// Chip: ATtiny412
// Programmer: Xplained Mini (mEDBG, debug chip: ATmega32u4)
// ATtiny416 Xplained Nano (ATTINY416-XNANO) Evaluation Kit
//
// Microchip ATtiny412-SSN (8-Pin SOIC)
// Pin Signal Function | Pin Signal Function
// 1: VDD +5V | 8: GND GND
// 2: PA6 DAC DAC0.OUT | 7: PA3 N.C.
// 3: PA7 OUT_REV PORT.OUT | 6: PA0 UPDI UPDI
// 4: PA1 OUT_FWD PORT.OUT | 5: PA2 VR ADC
//
// TOSHIBA TB67H450FNG (8-Pin SOIC)
// Pin Signal | Pin Signal
// 1: GND GND | 8: OUT2 MOT_FWD
// 2: IN2 OUT_FWD | 7: RS RS
// 3: IN1 OUT_REV | 6: OUT1 MOT_REV
// 4: VREF DAC | 5: VM +12V
//
//------------------------------------------------------------------------------
#define PIN_LED1 PIN_PA1
#define PIN_LED2 PIN_PA7
#define PIN_VREF PIN_PA6
#define PIN_ADC PIN_PA2
int duty_max = 1000;
int duty[] = { 0, 9, 18, 30, 43, 59, 77, 98, 122, 150,
183, 221, 265, 316, 376, 445, 526, 619, 728, 854,
1000, 854, 728, 619, 526, 445, 376, 316, 265, 221,
183, 150, 122, 98, 77, 59, 43, 30, 18, 9,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
// duty[n] = (20 ^ (n / 20) - 1) / 19 * 100
unsigned int duty_size;
void setup() {
pinMode(PIN_LED1, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
pinMode(PIN_VREF, OUTPUT);
digitalWrite(PIN_LED1, LOW);
digitalWrite(PIN_LED2, LOW);
digitalWrite(PIN_VREF, HIGH);
duty_size = sizeof(duty) / sizeof(duty[0]);
}
int index1p = 0;
int hysteresis = 0;
void loop() {
int adc = analogRead(PIN_ADC) + hysteresis;
int index1 = (unsigned int)min(max(adc, 0), 1023) * duty_size / 1024;
hysteresis = ((index1 > index1p) ? 1 : hysteresis);
hysteresis = ((index1 < index1p) ? -1 : hysteresis);
index1p = index1;
int index2 = (duty_size - 1) - index1;
for (int i1 = 0; i1 < duty_max; i1++) {
int i2 = (duty_max - 1) - i1;
digitalWrite(PIN_LED1, ((i1 < duty[index1]) ? HIGH : LOW));
digitalWrite(PIN_LED2, ((i2 < duty[index2]) ? HIGH : LOW));
}
}
最後に水槽の写真です。
GEX グラステリア フィット 200H 水槽の中に、
オートヒーターミニ 10 と テトラ マイクロフィルター をセットして、
見えにくいですがミナミヌマエビの稚エビを飼っています。
調光している時の動画を載せたかったのですが、
PWM制御時のフリッカーが酷かったので断念しました。
以上です。
Seeeduino XIAOは小型で安価で使い勝手が良く、
私はよく使っているのですが、
ファームを書き込むのに、一々 Arduino IDEや VSCode(+PlatformIO)を
起動しなければならないのが少し面倒に思っていました。
それで色々検索したところ、
Seeeduino XIAOをブートローダーモードで起動して、
uf2ファイルを Arduinoドライブにコピーすればよいことが分かりました。
手順は「CircuitPythonのインストール」と同じで、
CircuitPythonの代わりに自作の uf2ファイルをコピーすれば大丈夫です。
今まで uf2ファイルというのは、てっきり CircuitPython専用のフォーマット
なのかなくらいにしか思っていなかったのですが、
Microsoftが作ったフォーマットみたいです。
ちなみに私がリセットするときは、
RSTピンをUSBコネクタのシェル(GND)に接触させています。
binファイルを uf2ファイルに変換するのには、
GitHubで公開されている uf2conv.py スクリプトを使います。
ただPythonをインストールするのも面倒なので、
必要最小限の処理のみ PowerShellで作りました。
ps1ファイルを実行すると、同じフォルダにある .binファイルが一覧表示されるので、
変換したいファイルの番号を入力すると、.uf2ファイルに変換されます。
# Convert-BinToUf2.ps1
# from uf2conv.py (https://github.com/microsoft/uf2)
Set-Location $PSScriptRoot
$UF2_MAGIC_START0 = 0x0A324655 # "UF2\n"
$UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected
$UF2_MAGIC_END = 0x0AB16F30 # Ditto
$appstartaddr = 0x2000 # for Seeeduino XIAO
$familyid = 0x0
Write-Host "* Convert .bin to .uf2"
$files = Get-ChildItem -Filter "*.bin"
for ($i = 0; $i -lt $files.Length; $i++) {
Write-Host "No.$($i + 1) : $($files[$i])"
}
$index = 0
$text = Read-Host "Enter Number"
if (-not [Int]::TryParse($text, [ref]$index)) {
exit
}
if (($index -lt 1) -or ($index -gt $files.Length)) {
exit
}
$file = $files[$index - 1].FullName
$file_content = Get-Content -LiteralPath $file -Encoding Byte
$numblocks = ($file_content.Length + 0xFF) -shr 8
$outp = @()
foreach ($blockno in @(0..($numblocks - 1))) {
$ptr = 0x100 * $blockno
$chunk = $file_content[$ptr..($ptr + 0xFF)]
$flags = 0
if ($familyid) {
$flags = $flags -bor 0x2000
}
$block = @(
[System.BitConverter]::GetBytes([Int32]$UF2_MAGIC_START0),
[System.BitConverter]::GetBytes([Int32]$UF2_MAGIC_START1),
[System.BitConverter]::GetBytes([Int32]$flags),
[System.BitConverter]::GetBytes([Int32]($ptr + $appstartaddr)),
[System.BitConverter]::GetBytes([Int32]256),
[System.BitConverter]::GetBytes([Int32]$blockno),
[System.BitConverter]::GetBytes([Int32]$numblocks),
[System.BitConverter]::GetBytes([Int32]$familyid),
$chunk,
(@([Byte]0x00) * (0x200 - (32 + $chunk.Length + 4))),
[System.BitConverter]::GetBytes([Int32]$UF2_MAGIC_END)
) | ForEach-Object { $_ }
$outp += $block
}
$outp | Set-Content -LiteralPath ($file -replace "\.bin$", ".uf2") -Encoding Byte
exit
こちらのサイトでは、オンラインで変換ができます。
説明は下のサイトにあります。
.binを.uf2に変換するWebサイト - Seeed K.K. エンジニアブログ
以上です。
久しぶりにアクアリウムの話題です。
以前飼っていたメダカは残念ながら全て亡くなり、
今は、
・ ゴールデンバルブ … 1匹 (2018年11月から)
・ コリドラス ロングフィン パレアタス (青コリ) … 1匹 (2020年3月から)
を飼っています。
それでまたメダカを飼いたくなり店へ行ったのですが、
欲しかったクロメダカがどれも小さく痩せた個体でしたので、シマドジョウを買いました。
最初にリセット後の水槽の写真です。
新しい環境になり、縦横無尽に動き回っています。
今までフィルターは専ら水中ポンプの底面フィルターを使っていたのですが、
・ 底床を厚くする必要がある
・ 水中ポンプが見えてしまう
のが気になって、
今回は GEX サイレントフロー パワー フィルターを使うことにしました。
純正の活性炭パワーマットは使わずに、代わりに
ゼンスイ ZEST バクテリアホールド(Sサイズ)というポリプロピレン製のリング濾材を
100均の水切りネットに入れてセットしました。
また生体の侵入防止のため(といっても今回はそこまで水位を上げませんが)、
吐出口には100均の鉢底ネットをセットしました。
またこのフィルターは吸水口から入ったゴミで水中ポンプが詰まりやすいようなので、
ゴミが入る前に物理濾過ができるように、フィルターの外ケースの底面に
両面テープを貼ってダイソーの収納ケース(ONE strage W8.5xD8.5xH8.7cm)に入れて、
隙間に大磯砂を入れました。
この大磯砂の部分だけ底面フィルターのようになり、
溜まったゴミはプロホースでザクザク吸い出せるようになります。
そうして工夫したフィルターを水槽にセットしました。
キスゴムがあるとフィルターとガラスとの間に隙間ができてしまいますので、
キスゴムを外して両面テープでガラスに貼りました。
このフィルターは二重構造になっていますので、外ケースを両面テープで固定しても
内側のフィルタを取り出すことができ、メンテナンスに支障はありません。
水槽の背面から撮った写真です。
底床は、GEX 水洗い不要天然砂 リバーブレンド を使いました。
隠れ家は、SUDO フィールドロック3 M-A を使いました。
カルキ抜きをした水道水を入れました。
水位は吐出口より下にしています。
この水位であれば水が飛び跳ねる音はまったくしません。
買ったシマドジョウの袋を水槽に入れ、しばらく待って水温を合わせた後、
水槽に入れました。
それが最初の写真になります。
最後おまけですが、リセット前にゴールデンバルブがいたときの写真です。
ゴールデンバルブはもう一つあるコリドラス水槽に移してからリセットしました。
これまで何回かリセットをしましたが、すぐ茶ゴケ?で酷くなってしまいます。
以上です。