SSブログ
前の10件 | -

Digispark の P5 を ADC で入力ピンとして使う 後編 [Arduino]

ロータリーディップスイッチで作ってみた。
rotary_bread.jpg

カーボン抵抗 と 金属皮膜抵抗
resistors_carbon.jpg resistors_metalfilm.jpg

抵抗の順番を間違えたのでLEDの並びが MSD ---- LSD となった。

チャタリングが確認できる。
タグ:抵抗 ADC Digispark
nice!(0)  コメント(0) 

Digispark の P5 を ADC で入力ピンとして使う 前編 [Arduino]

Digispark の互換機は P5 がリセットピンになっています。
(どうやら本家はFUSE設定ではじめから入出力ピンとして使えるらしい?)

FUSEの変更(hfuse:5F→DF or 5D→DD) という方法が王道とは思いますが、リセットピンのままでもADC入力としては使えるという情報をどこかで見かけたので試してみました。

ただ電圧下げすぎるとリセットがかかってしまいます。
(Vcc 5VのとHIGH⇒LOW(VIL)は2.25Vくらい)

Digisparkで複数のタクトスイッチを扱う:放課後マイコンクラブ:SSブログ
https://hello-world.blog.ss-blog.jp/2022-05-29

抵抗分圧でやるのもいいですが、、同時押しには対応できないし。

ロータリーコードスイッチ 10ポジション 0~9 正論理 S-2110A_ 制御部品・駆動部品 秋月電子通商-電子部品・ネット通販
https://akizukidenshi.com/catalog/g/g110399/
s-2110a.jpg
こういうのでやろうと思って。
DIPスイッチみたいに設定用のスイッチに使うのががよさそう。
こういう用途ならチャタリングとか考えなくていいし。

ラダー抵抗でのD/A変換のような感じでいけるかと思いきや、スイッチはHIGH/LOWではなく、ON/OFFなのでできなさそう。

ということで、手探りで回路を作ってみた。

ds_p5_circ.png
http://www.falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWcMBMcUHYMGZIA4UA2ATmIxBTxCQBZtqBTAWjDACgAnEJmqsQyCF7gBUZHDYBncGBThK4DIXlVBggGYBDADaSGbAG6LlKBMp5VTytUMFIbMBJyF8FrObNVCME6e5GCYEoBYho6elIycigoNMYUsaEgWrr6frLgxB7BYFlJKRFcwvyBGSViYPCQzsV5-rlygjHwzv4xccLtYjQ+EgDu8Z6DotUDtXKdidUADi4gxMpBygsg9GpsY65Uwiuj8Vb7UxtzQ8Ujx0sJcZcNUBc5dTnBezdPi+ebIeN3AzduwbtjhYQsCDuwgA

rotary_sw_circ.png
rot_res_calc.png
rot_res_calc_tbl.png
漸減かつ2%の直線とわりと近似している。

rot_res_prototype.jpg
//  +5V ---[1k]---+-----+--[sw]--[47k]--+--- GND
//                |     +--[sw]--[22k]--+
//              <P5>    +--[sw]--[10k]--+
//                      +--[sw]--[4k7]--+

const uint8_t   LEDsPn[4] = { 0, 1, 2, 4 };     // pin number
const uint16_t  Vth[16]   = { 1012, 990, 969, 945, 921, 903, 885, 860,
                               836, 821, 806, 789, 773, 760, 747,   0 };
                               
void setup() {
  for(uint8_t i=0; i<4; i++)  pinMode( LEDsPn[i], OUTPUT );
}

void loop() {
  uint8_t   n, i;
  uint16_t  Va = analogRead( A0 );              // Digispark : P5, ADC0
  for(n=0; Va<Vth[n]; n++);                     // Compare with each threshold and get the value
  for(i=0; i<4; i++)  digitalWrite( LEDsPn[i], (n>>i)&1 );
}

1~2%の電位差を読み取る必要があるのだけれど、5%誤差のカーボン抵抗でつくった試作回路&スケッチでちゃんと4ビットを識別できた。
ちゃんとやるなら金属皮膜抵抗をつかったほうがよさそう。

タグ:抵抗 Digispark ADC
nice!(0)  コメント(0) 

抵抗値の表記 EIA-96 [パーツ]

Digispark互換機のpull up抵抗が「102」ということで規定の1.5kΩではなく1kΩでした。
ねんのため規定の1.5kΩを注文してみたら「152」じゃなくて「188」?「881」?

eia96_1500ohm.jpg

ということで調べてみたら、「EIA-96 coding」というのがありました。
「188」や「881」ではなく、「18B」でした。
「18」→ 150、「B」→ x10 = 1500 Ω でした。

ということで、自分でも対応表をエクセルで作ってみた。
抵抗値のフォントがあったらよかったんだけどな。

EIA-96-coding.png

タグ:抵抗
nice!(0)  コメント(0) 

USB Type-C の Digispark 互換機を作ってみた。その2 [Arduino]

ブートローダを変更します。
もともとは firmware version 1.6 が入っていました。
ブートローダもいろいろなものがあるようですが、ATTinyCoreでお世話になっているSpenceKondeさんのところのを使うことにしました。

GitHub - SpenceKonde-ATTinyCore- Arduino core for ATtiny 1634, 828, x313, x4, x41, x5, x61, x7 and x8
https://github.com/SpenceKonde/ATTinyCore

ここから、
📂avr
 📂bootloaders
  📂micronucleus
まで行きます。

Digispark(互換機)から外したATtiny85なので、すでにmicronucleusが入っているため、リストの下のほうにある upgrade-attinyXX_XXXX.hex を選びます。(attinyXX_XXXX.hexはISPで書き込む用っぽい)
よくわからないけど「upgrade-attiny85_porf.hex」にしてみた。
porfは、Power-on Reset Flag(電源ONリセットフラグ)のことかなって思って。

このブートローダにすることで、スライドスイッチでUSB切断時には電源投入とほぼ同時にスケッチが動き出すようになりました。

HIDデバイスなどUSB機能を使いつつも待ちたくない場合は、以下の記事どおりちょっと古い ver1.11を使うことになりそう。
アップデートの方法も同様。

Digispark 起動までの5秒待たないBootloader:放課後マイコンクラブ:SSブログ
https://hello-world.blog.ss-blog.jp/2022-05-14

パーツどり後の抜け殻
ds_shell.jpg
nice!(0)  コメント(0) 

USB Type-C の Digispark 互換機を作ってみた。 [Arduino]

久しぶりにDigisparkネタ。
使い慣れたAVRで同じ8ピンのATtiny202や412と比べて、容量も大きく、USBにダイレクトでつながるのは魅力的。
ただ本家は販売しておらず、互換機しか売っていない状態。
Type-A直挿しタイプは差し込み口が9mmくらいしかなく(本来規格上は11.75mm)、うちのパソコンだと届かなくて認識されないのも問題。
micro USBのタイプは、いまどきじゃないので避けたい。
共通して言えるのはブレッドボードで使いづらい。

ということで Type-C の Digispark互換機を自作してみた。

方向性:
・もちろん接続はUSB Type-C
・電源はType-Cからの供給として外部入力なし
・ブレッドボードに載るレイアウト
・P3(PB3,USB D-), P4(PB4, USB D+)もできればI/Oピンに使いたい
・電源LED なし、BUILTIN LED も用途が限られるのでなし

c_spark85_sch.png
ちょっと工夫したのは、 スライドスイッチでUSB機能を使うか外部ピンを使うか選択すること。
USBの信号を物理的に切り離すスイッチを付けてみた。
ただ、pull up抵抗をUSB側に残すとUSB機器として認識されてしまうようなので、D-のpull up抵抗はATtiny85側に持ってくることにしました。68Ωの抵抗はダンピング抵抗というもののようなので、pull up抵抗よりUSB側に持ってきても大丈夫かなと思って移動してみました。(いいのかどうかはわからない)
ということで、P3(PB3,USB D-)のpull upだけは妥協することにしました。
c_spark85_pcb.png

スライドスイッチは、DPDT(Double Poles Double Throws, 双極双投, 2回路2接点)です。

表面実装用スライドスイッチ SSSS213202_ 制御部品・駆動部品 秋月電子通商-電子部品・ネット通販
https://akizukidenshi.com/catalog/g/g105043/

これをDPDTと思い込んでフットプリントも作成して基板をオーダーしていざ作ってみたら案の定動かない。これは、SPDT(単極双投, 1回路2接点)だから。

スライドスイッチ IS-2245S-G_ 制御部品・駆動部品 秋月電子通商-電子部品・ネット通販
https://akizukidenshi.com/catalog/g/g115369/

ちょっとフットプリントが違うけど、なんとか載せられた。
機構部品は面積大きいので、やむなく両面実装に。

c_spark85_1.jpg
c_spark85_2.jpg
パーツは、基板の他に、Type-Cレセプタクル、CC(Configuration Channel)の5.1kΩ抵抗、スライドスイッチと、それ以外はDigispark(互換機)から外して使用。

0, 1, 2, 4ピンを使って、CharlieplexingでLED 12個操作。
c_spark85_3.jpg

タグ:Digispark Type-C
nice!(0)  コメント(0) 

1ピンだけで2個のLEDを別々に操作する その2 [Arduino]



マイコンの1本のI/O端子で2個のLEDを駆動:Design Ideas - EDN Japan
https://edn.itmedia.co.jp/edn/articles/0806/01/news020.html

ここを元にシミュレーションしてみた。

ツェナーダイオード使用バージョン
2leds_zener.png

ダイオードを4個直列バージョン
2leds_2pairs.png

LEDは一定以上の電圧にならないと電流が流れないのをうまく利用している。

2x2leds.jpg
nice!(0)  コメント(0) 

1ピンだけで2個のLEDを別々に操作する [Arduino]



以前にATtiny202で踏切の音と光を出すのをやりました。
ただATtiny202はふつうに使えるGPIOが5つしかないのでなるべく使用するピン数を少なくしたいところ。
LEDを1ピンだけで2個別々に操作することを思いついたのでやってみました。
(多分すでに誰かやってると思うけど)(NeoPixelを使うというのもありだけど)
5VとGNDの間に抵抗を入れて真ん中で分圧し、そことGPIOのHigh、Low、Hi-Zの3ステートで、2個の極性の反対のLEDを個別に点灯。
両方点灯させたいときはダイナミック点灯で。
欠点としては、やや暗いのと、消灯時でも電流を消費することかな。

Circuit Simulator Applet
https://www.falstad.com/circuit/circuitjs.html

というのでシミュレーションしてみた。
2leds_h.png
2leds_z.png
2leds_l.png

// LED test : Blink two LEDs using only one pin
//    +5V ---[470 Ohm]--+---+--|<|--+--- GPIO (H/L/Hi-Z)
//    GND ---[470 Ohm]--+   +--|>|--+

#define LED_PIN   2

void setup() {
}

void loop() {
  unsigned int i;
  
  pinMode(LED_PIN, OUTPUT);
  for(i=0; i<4; i++) {
    digitalWrite(LED_PIN, i&1);         // Blink LEDs alternately
    delay(500);
  }
  
  pinMode(LED_PIN, INPUT);              // Off LEDs
  delay(1000);
  
  pinMode(LED_PIN, OUTPUT);
  for(i=0; i<1000; i++) {
    digitalWrite(LED_PIN, i&1);         // dynamic both LEDs on
    delay(1);
  }
  
  pinMode(LED_PIN, INPUT);              // Off LEDs
  delay(1000);
}


もっといいやり方があるらしい。

マイコンの1本のI/O端子で2個のLEDを駆動:Design Ideas - EDN Japan
https://edn.itmedia.co.jp/edn/articles/0806/01/news020.html

nice!(0)  コメント(0) 

UNO R4 ライブラリ使わずにNeoPixel を使ってみる。 [Arduino]

ライブラリ使わずに NeoPixel を使ってみる。

素直にライブラリ使えばいいじゃん、っていう話なんですけど。

83.3nsという100ナノセカンドオーダーでI/Oポートレジスタの操作ができることを利用して、NeoPixelの制御信号を作ってみました。

// UNO R4 minima NeoPixel test
inline void PH()  {   R_PORT1->POSR = bit(11);  }       // D13(UNO R4 minima P111) HIGH (83.3ns)
inline void PL()  {   R_PORT1->PORR = bit(11);  }       // D13(UNO R4 minima P111) LOW  (83.3ns)
inline void T0()  {   PH(); PH(); PH(); PH(); PL(); PL(); PL(); PL(); PL(); PL(); PL(); PL();   }
inline void T1()  {   PH(); PH(); PH(); PH(); T0();   }

#define NUMPIXELS (12)
uint8_t pixels[NUMPIXELS * 3];  // GRBGRBGRB...

void setup() {
  R_PORT1->PODR |= bit(11);     // D13(UNO R4 minima P111) pinMode OUTPUT
}

void loop() {
  for (uint8_t i = 0; i < NUMPIXELS; i++) {
    for (uint8_t c = 0; c < 6; c++) {
        pixels[ ((NUMPIXELS + i - c) * 3 + 2) % (NUMPIXELS * 3) ] = 31 >> c;
    }
    neoPixelShow();
    delay(100);
  }
}

void neoPixelShow() {
  for(uint8_t i = 0; i < NUMPIXELS * 3; i++) {
    for(uint8_t bm = 0b10000000; bm; bm >>= 1) {
      noInterrupts();
      if (pixels[i] & bm) T1();   else  T0();
      interrupts();
    }
  }
}

r4neopixel.jpg

タグ:Uno R4 NeoPixel
nice!(0)  コメント(0) 

UNO R4 digitalWrite と I/Oポートレジスタ [Arduino]

UNO R4 で digitalWrite() の代わりに、I/Oポートレジスタを制御することで高速化できるということは、各所で報告されております。

digitalWriteFast with UNO R4 - UNO R4 _ UNO R4 Minima - Arduino Forum
https://forum.arduino.cc/t/digitalwritefast-with-uno-r4/1145206

digitalWrite() と I/Oポートレジスタの制御でどのくらい時間が違うのかですが、
HIGH, LOW 1000回ループと、HIGH, LOW, HIGH, LOW 1000回ループの差分でfor()ループの影響を除去してHIGH, LOW 1000回分だけとして、これを2で割って、digitalWrite() 1回分にかかる速度を調べてみました。ただ、割り込みなどがあるので、その時々で結構まちまちの値が出ました。

だいたい、
digitalWrite(LED_BUILTIN, HIGH); や
digitalWrite(LED_BUILTIN, LOW);
で 700 ns ちょっと。

R_PORT1->POSR = bit(11); や
R_PORT1->PORR = bit(11);
で 83 ns ちょっと。

UNO R4が48MHzということは、CPU 1cycleあたり、20.8333 nsくらい。
83.333nsだと、4 cyclesに相当するのかな?

ポート操作は速いけど、UNO R4は、「MINIMA」と「WIFI」でも一部ポートが違うので注意。

dif_minima_wifi.png
タグ:Uno R4
nice!(0)  コメント(0) 

ケーブルあれこれ。 [周辺機器]

10Gにしたら機器が増えてケーブルもこんがらがっているので程よい長さのもので整理してみた。

■LANケーブル
カテゴリー6Aとカテゴリー7(もどき)で迷った。
カテゴリー7(もどき)は、かえってノイズが入るらしい情報も散見。
以下の情報からカテゴリー7でも悪くはないようなので、気分を上げるためにカテゴリー7(もどき)にした。

結局、STPはダメなの? UTPでいいの? LANケーブルの専門家に聞く【イニシャルB】 - INTERNET Watch
https://internet.watch.impress.co.jp/docs/column/shimizu/1331973.html


■電話線
以前は50cmのものだったけど、装置が増えて壁から離れてしまったので、1mのものに。
爪折れしにくいタイプのものにした。(外すことよっぽどないけど)


■アンテナ線
nasneを介するため2本必要。
もともとは5C同軸ケーブル(約7.7mm)の2mほどのものがぐるぐる巻きになっていた。
屋内だし、4C同軸ケーブル(約6mm)の50cm, 1mのものに変更。


■電源ケーブル
メガネケーブルでつなぐACアダプタが多すぎで場所をとるので、だいぶ前に購入してあった便利グッズを使用。三またメガネケーブル。現在は販売されていないらしい。
meganegidora.jpg
ダイヤテック「めがねギドラ」
https://www.google.com/search?q=FCC3M-04

それでも足りないので電源タップを使用。
ほこりっぽいところなので、電源タップも防塵タイプのものに。



エレコム LANケーブル CAT7 0.5m ツメが折れない 爪折れ防止コネクタ スタンダード ブルーメタリック LD-TWST/BM05

エレコム LANケーブル CAT7 0.5m ツメが折れない 爪折れ防止コネクタ スタンダード ブルーメタリック LD-TWST/BM05

  • 出版社/メーカー: エレコム(ELECOM)
  • 発売日: 2013/05/26
  • メディア: Personal Computers


エレコム LANケーブル CAT7 1m ツメが折れない 爪折れ防止コネクタ スタンダード ブルーメタリック LD-TWST/BM10

エレコム LANケーブル CAT7 1m ツメが折れない 爪折れ防止コネクタ スタンダード ブルーメタリック LD-TWST/BM10

  • 出版社/メーカー: エレコム(ELECOM)
  • 発売日: 2013/05/26
  • メディア: Personal Computers


パナソニック WHA2513WKP

パナソニック WHA2513WKP

  • 出版社/メーカー: パナソニック(Panasonic)
  • 発売日: 2024/02/07
  • メディア: エレクトロニクス









テレホンコード 標準タイプ ホワイト 1m_TEL-C2602W 05-2602 OHM オーム電機

テレホンコード 標準タイプ ホワイト 1m_TEL-C2602W 05-2602 OHM オーム電機

  • 出版社/メーカー: (株)オーム電機
  • メディア:



タグ:LAN
nice!(0)  コメント(0) 
前の10件 | -