2019年7月20日土曜日

ATTINY85(Digispark)との格闘Ⅱ(謎のPULL-UP)

ATTINY85(Digispark)との格闘、第Ⅱ段です。
DigisparkとATTINY85の内部PULL-UPの妙な挙動についてです。

このボード型のDigisparkには、ATTINY85のSOPチップが乗ってます。
これで動いたスケッチを~
この生ATTINY85 DIPチップに書き込みます。
所が、動かないのです。
前回の格闘Ⅰで、Arduino UNO書込機でFuseビットとBootloaderを書き込んでて
Lチカは、動作するのです。
壊れたかもと、別のチップでやっても同様に動作しません(T_T)
という妙な事に遭遇しました。

動きが妙だというスケッチは、
PB2とPB3をINPUTで内部PULL-UPを有効にしています。
タクトSWでLOWに落としてボタンを検出するのです。
*****
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
*****

しかし、PB2とPB3をテスターで確認すると
PULL-UPされてなく、ほとんどLOWレベルなのです。

調べて見ると、digistumpのここに妙な記述が
*****
if I remember it correct, i also experienced "pinMode(x, INPUT_PULLUP)" does not work with Digisparks. Must be some missing defines in the Attiny core.

The simplest workaround is to activate the pullup with "digitalWrite(x,HIGH)". By default the pins are defined as INPUTs, and when you write a logical "1" to an INPUT, this activates the pullup.
*****
つまり、
Digisparkは、Attiny coreの定義ミスで
「pinMode(x, INPUT_PULLUP)」は、動作せず、
「digitalWrite(x,HIGH)」すれば内部Pull-Upがを有効になる。
ということなのです。

で、早速、PB2を変更してみます。
*****
//  pinMode(2, INPUT_PULLUP);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
*****
⇒⇒⇒ ダメです(T_T) LOWのままなのです。

*****
//  pinMode(2, INPUT_PULLUP);
//  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
*****
⇒⇒⇒ やっぱりLOWのままなので
外付抵抗6.8KΩでPULL-UPしたら、
全体のスケッチは、動くようになりました。
CO2レーザーカッターのZ軸可動Controllerの作成途中なのです。

***やっと動いた版***
// CO2 Laser Cutter Z-Axis Controller
// DigiSpark (ATTINY85)

void setup() {
  pinMode(0, OUTPUT);       //DIRECTION
  pinMode(1, OUTPUT);       //STEP Pluse
//  pinMode(2, INPUT_PULLUP); //UP Button
//  pinMode(2, INPUT);
  digitalWrite(2, HIGH);  // これでPullUPがActiveteされる
//  pinMode(3, INPUT_PULLUP); //DOWN Button
//  pinMode(3, INPUT);
  digitalWrite(3, HIGH);  // これでPullUPがActiveteされる
//  pinMode(4, INPUT_PULLUP); //LimitSW
//  pinMode(4, INPUT);
  digitalWrite(4, HIGH);  // これでPullUPがActiveteされる
  pinMode(5, INPUT);    //Reset(念の為)
}

void loop() {
  // UP & DOWN
  if (digitalRead(2) == LOW) { // UP Button
    digitalWrite(0, HIGH); // DIRECTION UP
      move();
  }
  if (digitalRead(3) == LOW) { // DOWN Button
    digitalWrite(0, LOW); // DIRECTION DOWN
      move();
  }
}

void move() {
  digitalWrite(1, HIGH);
  delayMicroseconds(2250);
  digitalWrite(1, LOW);
  delayMicroseconds(2250);
}
******

それにしてもボードタイプのDigisparkは、動いたのに
生チップにBootloader入れて作ったやつは、PULLUPが効かない...
チップがなにか違うのだろうか?

ちょっと実験してみることに!

DIPの単体チップは、これに装着することにします。
TYPE-Aとします。

TYPE-Bとします。

まずは、このテストスケッチ
単純なLチカで残りの端子を"INPUT_PULLUP”してみます。
***INPUT_PULLUP_TEST_A.ino***
void setup() {                
  pinMode(0, OUTPUT); //LED on Model B
  pinMode(1, OUTPUT); //LED on Model A  or Pro
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
}

void loop() {
  digitalWrite(0, HIGH);
  digitalWrite(1, HIGH);
    delay(500);
  digitalWrite(0, LOW);
  digitalWrite(1, LOW);
    delay(500);
}
*****

HIGHレベルは、Minimum 0.7 x VCC、なので
4.7 x 0.6 = 2.82V
赤文字の所が、HIGHに達していません(T_T)
TYPE-Aは、PULL-UPが全然効いてない様子です。
PB0、PB1もやればよかったのですが...
PB2PB3 PB4  
 TYEP-A   0.1~1.2V変動  2.9V  0V 
TYPE-B4.7V3.0V1.5V
(VCC=4.7V)

これは、変です。
回路図と睨めっこは、最後にやってます^^;

で、ひょっとしてATTINY85単体は、
これにしないといけないのかも? と思って
[ATTinyCoreのATtiny25/45/85]に設定してみると、
項目がいっぱい増えました!
とりあえず、ここままやってみると、
エラー(T_T)
*****
書き込み中にエラーが発生しました:設定パラメータの「program.params.verbose」が見つかりません
*****
とでてます。
ボード、単体チップでの差があることと、
"_PULLUP"は、意味がないことが、わかりました。
それにしても不安定です。

次に、これやってみました!
赤行をやめて、青の行を追加。
***INPUT_PULLUP_TEST_B.ino***
void setup() {           
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
//  pinMode(2, INPUT_PULLUP);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
//  pinMode(3, INPUT_PULLUP);
  pinMode(3, INPUT);
  digitalWrite(3, HIGH);
//pinMode(4, INPUT_PULLUP);
  pinMode(4, INPUT);
  digitalWrite(4, HIGH); 
}
*****
なぜか、TYPE-A、2回目は、USB経由での書き込みできません。
仕方ないのでArduino UNOのBootloader書込機で書込しました。

HIGHレベルは、Minimum 0.6 x VCC、なので
4.7 x 0.7 = 2.82V
赤文字の所が、HIGHに達していません(T_T)
"_PULLUP"よりは、マシですが、TYPE-AもBもPB4が変です。
  PB2PB3 PB4  
 TYPE-A   4.7V  2.9V  1.5V 
TYPE-B 4.7V4.4V2.2V
(VCC=4.7V)

次は、digitalWriteだけにしてみます。
***INPUT_PULLUP_TEST_C.ino***
void setup() {           
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
//  pinMode(2, INPUT_PULLUP);
//  pinMode(2, INPUT);
  digitalWrite(2, HIGH);
//  pinMode(3, INPUT_PULLUP);
//  pinMode(3, INPUT);
  digitalWrite(3, HIGH);
//pinMode(4, INPUT_PULLUP);
//  pinMode(4, INPUT);
  digitalWrite(4, HIGH);
}
*****

デフォルトINPUTになるということなので
pinMode(x, INPUT)の有無には関係しないんですね。
TYPE-Aは、別のチップも確認してみましたが、全く同じ結果でした。
  PB2PB3 PB4  
 TYPE-A   4.7V  2.9V  1.5V 
TYPE-B 4.7V4.4V2.2V
(VCC=4.7V)

本日の教訓
【DigisparkとATTINY85では、外部PULL-UP抵抗必須!】

それにしてもPB3、PB4の挙動は、変です。
ちょっと回路図を眺めてみます。

回路図は、このDigistump CreatedのPDFで合ってると思います。
ATTINY85周辺だけを拡大すると
・PB0、PB2、PB5:OPEN

・PB1:LED+1KΩ ~ GND
  LED 2Vとすると4.7KΩでPULL-UPしても2.5Vまでしか上がらない。
  2KΩ以下でPULL-UPしないとHIGHレベルにならないでしょう。

・PB3:66.5Ωを挟んで3.6Vツェナーと1.5KΩ PULL-UP
・PB4:66.5Ωを挟んで3.6Vツェナー

5V - 3.6V = 1.4V が 66.5Ωの両端に掛かることになり、
66.5Ωの電流は、1.4 ÷ 66.5Ω = 21mA!
DC Current per I/O Pin ... 40.0mAなので、定格内ですが
先の実験でTYPE-AもTYEPE-BもHIGHレベルに達してないのは、
明らかにドライブ不足です。
USB信号は、LVTTL(Low Voltage TTL)でHIGH:3.3Vなので
3.6V付けてるんでしょうが、このレベル変換は、大胆すぎます。


これでかなりの時間振り回されました(T_T)
DidisparkとATTINY85、ボードにしろチップ単体にしろ癖がありすぎです。
ちょっと嫌いになった感じです(´-﹏-`;)

<教訓>
・Digispark(ATTINY85)は、PinMode設定しなくても、Default INPUT
・PinMode設定しないで「digitalWrite(x, HIGH);」だけで
 内蔵PULL-UPされるが、十分にHIGHにならないPINがある
 必ず、外部PULL-UP抵抗をつける
・ボードタイプは、PB1、PB3、PB4にぶら下がってるパーツを考慮する
・特にPB3、PB4の3.6Vツェナーダイオードは、電流食う

・総じて、Digisparkボードタイプ(CLONEしか使ったことないけど)は、
 使わない方が良さそうです(T_T)
・せめて単品のATTINY85で使う

0 件のコメント: