2018年4月28日土曜日

DigisparkのUSB-Serial通信での奮闘記

世間では、Win7時代に流行ったようですが
マーティーは今頃、Digisparkにハマっています。

Digisparkでは、USBでのSerial通信に標準の「Serial.print」は、使えません。
コンパイルと書き込みはエラーがでないのですが
正規のUSBではなく、V-USBなので、WindowsにCOMポートができないのです。

Digisparkのボードマネージャーをインストールすると
[スケッチの例]-[DigisparkCDC]の[CDC_LED]は、
シリアルモニタから「0」「1」を入力すると
Digispark上のLEDをON/OFFさせるものです。
SerialUSB コマンドが使われています。
*****
#include <DigiCDC.h>
void setup() {                
  // initialize the digital pin as an output.
  SerialUSB.begin(); 
  pinMode(1,OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  
  //turns led on and off based on sending 0 or 1 from serial terminal
  if (SerialUSB.available()) {
    char input = SerialUSB.read();
    if(input == '0')
      digitalWrite(1,LOW);
    else if(input == '1')
      digitalWrite(1,HIGH);
      
  }
  
   SerialUSB.delay(100);               // keep usb alive // can alos use SerialUSB.refresh();
}
*****
で、コンパイルと書き込みはエラーはでず完了します。
が、抜き挿ししても「USBデバイスが認識できません」とでて
デバイスマネージャーには、
「不明なUSBデバイス(無効な構成記述子)」がでてきます。
Baudrateを入れないといけないのかな?
「Serial.begin(9600);」
と、やってみますが、この様にコンパイルエラーになるのです。
「#include <DigiCDC.h>」の下では、Baudrateは指定は、いかんようです。
*****
次のフォルダのライブラリDigisparkCDCを使用中:C:\Users\marty\AppData\Local\Arduino15\packages\digistump\hardware\avr\1.6.7\libraries\DigisparkCDC (legacy)
exit status 1
ボードDigispark (Default - 16.5mhz)に対するコンパイル時にエラーが発生しました。
*****
結局、元の「Serial.begin();」のままにして
何度かやれば認識してくれるだろうと、
また、USBに抜き挿しを繰り返していると
突然!Windows10がブルーバックになり再起動になりました _| ̄|○
Win10でこれがでるとは、かなり致命的です。
再起不能になるのかヒヤヒヤでしたが、幸い無事、再起動しました。
この方も「DigisparkでUSB経由のシリアル通信が出来ない」ということで
同じ様にブルーバックになってしまっています。
DigisparkのFirmwareを更新されたり、色々手を尽くされていますがダメだとのこと。
動いている方もいるので、WinやArduino IDEのバージョンの違いの原因かもですが
「SerialUSB」コマンドは、怖いので使わない方が無難なようです。

.....その後、USBのSerialライブラリに2種類あることがわかりました。
Echo(PCのシリアルモニタの入力と同じものを返す)のサンプルスケッチが
2種類あり、使っているライブラリが違うのです。

[DigisparlCDC]の「Echo」
ここの「CDC_LED」が先のブルーバックになる怖いやつです。
これは、もうやりません。
もうひとつは、[DigisparkUSB]の「Echo」です。
ブルーバックにならないことだけを祈りつつ、これを試してみます。
スケッチは、これです。
#include <DigiUSB.h> と DigiUSB.begin(); が使われています。
*****
#include <DigiUSB.h>

void setup() {
  DigiUSB.begin();
}

void get_input() {
  int lastRead;
  // when there are no characters to read, or the character isn't a newline
  while (true) { // loop forever
    if (DigiUSB.available()) {
      // something to read
      lastRead = DigiUSB.read();
      DigiUSB.write(lastRead);
      
      if (lastRead == '\n') {
        break; // when we get a newline, break out of loop
      }
    }
    
    // refresh the usb port for 10 milliseconds
    DigiUSB.delay(10);
  }
}

void loop() {
  // print output
  DigiUSB.println("Waiting for input...");
  // get input
  get_input();
}
*****
コンパイルと書き込みは、無地終了。
他のUSBを全部外して挿し直すと
おっ!
デバイスマネージャーに「DigiUSB」ってのが出現しています。
いい兆候です。
デバイスマネージャーには、普通のCOMポートはできていないので
Arduino IDEのシリアルモニタでは、何もできません。

探していると、
ここに情報が、引用させていただきますと
やっぱしそうなのか~
*****
 一応DigiCDCを使えばUSBでの仮想シリアルポートも使えるようだけど
 安定性の問題からDigiUSBに取って代わられてるみたい。
*****
*****
 PC側は専用にツールを作らないといけなかったり。
 一応PythonベースでArduinoのシリアルモニタのように使えるツールも
 公開されてるけど…
*****

その言葉を頼りに更に探すと
ここにDigiUSBのお作法とPythonのツールについてのリンクが!m(_ _)m
そのリンクからGitHubのここに飛んでいき
[Clone or download]から
「DigisparkExamplePrograms-master.zip」をDownloadします。
解凍すると配下の「Python\DigiUSB\windows」フォルダに
monitor.exeがあります。
ようやく準備ができました。
[DigisparkUSB]の「Echo」を書き込んだDigisparkを挿して
この「monitor.exe」を実行すると
「Waiting for input...」がでてきました!
受信成功です!
(Pythonは、この時にAnacondaでパッケージをインストールしています)
[Send to device:]の欄に「1」を入力してENTERすると
「1」が返ってきました。
送信も成功です。
ただ、この[DigisparkUSB]の「Echo」だけをコンパイルした結果は、48%
前回の最後のスクリーンショットのスケッチが77%だったので
組み合わせたスケッチは、100%超えになり、どっちにしろダメですね~
ひょっとしたら、できるかもと
スクリーンショットのスケッチにDiGiUSBのSerial通信を合体させてみました。
*****
#include <DigiUSB.h>
#include <CapacitiveSensor.h>
#include <DigiKeyboard.h>

#define KEY_PRINT_SCREEN 0x46

CapacitiveSensor cs_0_2 = CapacitiveSensor(0,2);
     //2pin:センシング  2-0pin:10MΩ
unsigned long csSum;
int LED_State = LOW;

void setup() {
    DigiUSB.begin();
    pinMode(1, OUTPUT);
}

void loop() {
    CSread();
}

void CSread() {
    long cs = cs_0_2.capacitiveSensor(80);
      //a: Calibration時の読取値からの増分をサンプル数80でサンプリングした合計値
    digitalWrite(1, LOW);
 if (cs > 1000) {
      //b: csが1000を超えるとSerialに数値を出力する
   csSum += cs;
      //csがb(1000)を超えている間は、LOOPする毎にcsSumに加算していく

   DigiUSB.print(cs); 
   DigiUSB.print("\t");
   DigiUSB.println(csSum); 

     if (csSum >= 20000)
      //c: csがb(1000)を超え続けて加算されたcsSumがc(20000)を超えるとTriggerと判定する
        {
         DigiUSB.print("Trigger: ");    //Serialに"Trigger"文字を出力
         DigiUSB.println(csSum);        //Triggerした時のcsSum値をSerialに出力

         digitalWrite(1, HIGH);
         DigiKeyboard.update();
         DigiKeyboard.sendKeyStroke(KEY_PRINT_SCREEN, MOD_GUI_LEFT);
         DigiKeyboard.delay(50); 
         digitalWrite(1, LOW);
          if (csSum > 0) { csSum = 0; } //Triggerしたら一旦csSumをClear(Reset)
            cs_0_2.reset_CS_AutoCal();    //読み取り停止してCalibration実行
        }
        } else {
           csSum = 0;
     //パッドから離れてcsがb(1000)を下回るとcsSumをClear
     //又は、抵抗がなかったり、容量が大き過ぎて読み取りがTimeoutした場合
  }
  DigiKeyboard.delay(10);
  DigiUSB.delay(10);   // refresh the usb port for 10 milliseconds
}
*****
コンパイルでエラーがでます。
結局、「#include <DigiKeyboard.h>」だけでエラーがでるのです。
つまり、DigikeyboardとDigiUSBは、同居できないのですね。
V-USBなので、同時にKeyboardとSerialの両方になるDeviceは作れんのかな~?
マーティーにはこの辺は、よくわかりません。

Digikeyboardを全てコメントアウトして書き込んで「monitor.exe」を起動すると
PythonのMonitorが動作しました。
数値が出るのが、ポツン、ポツン、ポツン、とめちゃくちゃ遅いです。
Pythonが重いからなのか、スケッチで何か抜けているのか???
Baudrateの設定は、できないようで
DigiUSB.begin(9600); にするとコンパイルで怒られます。
monitorにもBaudrateを設定する所はないので固定のようです。
一応、DigiUSBとPythonのMonitorを使えば、
何とかSerial通信できることだけは、確認できました。
Arduino UNO R3ならできるのだろうか?
ちょっと調べてみると、そう簡単にはいかんようです。

HID機能は、UNOのATMega328Pだけでは、実現できないのですね。
UNOでも[USB~Serial変換]にATMega16U2を積んだもので
更にATMega16U2のFirmwareを書き換えないとできないということ。
しかも、COMポートを開けるSerial通信と同時使用はできないらしい。
ATMega16U2付のArduino UNO R3ありましたが
送料含めて US$ 6.92! 今の所、興味はわきませんね~

ATMega32U4を積んだLeonardoやMicroであれば普通に動作するらしいのです。
だからArduino Microは、UNOの2倍近くするんですね~
てっきり小さいからだけだと思ってたら正規のUSB内蔵しているのかあ!
ん~ん、これは、試したくなりました!
これが最安値かな?
本体US$ 3.60、送料 US$ 0.26、合計US$ 3.86をポチって
締め括ることにします^^;

DigisparkとArduino UNOでCapacitiveSensing(容量検知センサー)

Arduinoには、Capasitive Sensingというライブラリがあるんですね~
今までは、PIC内蔵の容量検知モジュールで遊んでおりました。

たぶんここが本家英語の「Arduino Capasitive Sensing Library」解説です。
そこにYouTubeリンクがあり、更にリンクをたどっていくと
YouTubeをUpされた方のサイトがあります。
見慣れない小さなTeensyというArduino、興味をそそりますが
ちょっと調べるとUS$ 10程もするのでポチるのは、パス。

同様の内容が、このGitHubにもあげられています。

ライブラリ解説の日本語訳がここにありました。
ブレッドボーダーズのサイトのようです。

上の参考サイトのスケッチを見ると
CapacitiveSensor.cppとCapacitiveSensor.hが必要なのです。
PC内を検索してみるとArduino v1.8.3のインストールフォルダ配下の
「...\libraries\Adafruit_CircuitPlayground\utility」

「CPlay_CapacitiveSensor.cpp」
「CPlay_CapacitiveSensor.h」
が見つかりましたが
どうやらこれは、
adafruit circuit playground」という「ATmega32u4」が乗った
円形基板のSensorと多色LED付の小さなAll-In-One Board用みたいです。

で、先の「Arduino Capasitive Sensing Library」から
「CapacitiveSensor04.zip」をダウンロードします。
「arduino-libraries-CapacitiveSensor-0.5.1-3-ga07209f.zip」 って名前ですね~
ちょっと前に戻って、さっきの下の
「This updated CapacitiveSensor version 05」の方をクリックすると
GitHubに飛びます。
[Tags]を見ると「0.5.1」が最新のようでね~
それぞれのCapacitiveSensor.cppの日付を見ると
・最初の...0.5.1-3:2016/02/20
・GitHubのMaster:2018/03/15
・GitHubの5.1.0版:2016/01/05

日本語訳のサイトにあるアドレス
「http://arduino.cc/playground/uploads/Main/CapSense04.zip」
からダウンロードすると「CapSense04.zip」のファイル名です。

どうやら日本語訳の時点からバージョンアップされているんですね~
いくつかコマンドも変わっています。
・「CapSense CapSense」⇒「CapacitiveSensor CapacitiveSensor」
・「long capSenseRaw」⇒「long capacitiveSensorRaw」
・「long capSense」⇒「long capacitiveSensor」

ということで一番新しいGitHubのここのMasterを使うことにします。
Clone or download]クリックして[Download ZIP]して
「CapacitiveSensor-master.zip」をDownloadします。

CapacitiveSensor-master.zipを解凍すると
「CapacitiveSensor-master」フォルダができるので
フォルダ名を「CapacitiveSensor」に変えて(変えなくてもいいけど)
C:\Users\[User名]\Documents\Arduino\libraries
に入れます。(Windows10 64bitです)
これでライブラリのインストール完了です。
Arduino IDE v.1.8.3を再起動します。
[ファイル]-[スケッチの例]から
▼にカーソルを置いて一番下まで行って
[CapacitiveSensor]に[CapacitiveSensorSketch]をクリックすると
先の英語のサイトと同じスケッチが立ち上がります。
まずは、Arduino UNOでやってみます。
スケッチ例は、タッチパッド3個なので1個用に変更します。
*****
#include <CapacitiveSensor.h>
/*
 * CapitiveSense Library Demo Sketch
 * Paul Badger 2008
 * Uses a high value resistor e.g. 10 megohm between send pin and receive pin
 * Resistor effects sensitivity, experiment with values, 50 kilohm - 50 megohm. Larger resistor values yield larger sensor values.
 * Receive pin is the sensor pin - try different amounts of foil/metal on this pin
 * Best results are obtained if sensor foil and wire is covered with an insulator such as paper or plastic sheet
 */
CapacitiveSensor   cs_4_2 = CapacitiveSensor(4,2);        // 10 megohm resistor between pins 4 & 2, pin 2 is sensor pin, add wire, foil

void setup()                    
{
   cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);     // turn off autocalibrate on channel 1 - just as an example
   Serial.begin(9600);
}

void loop()                    
{
    long start = millis();
    long total1 =  cs_4_2.capacitiveSensor(30);

    Serial.print(millis() - start);        // check on performance in milliseconds
    Serial.print("\t");                    // tab character for debug window spacing
    Serial.println(total1);                  // print sensor output 1

    delay(10);                             // arbitrary delay to limit data to serial port 
}
*****

上のスケッチでは、
・Send Pin:Digital 4
・ReceivePin:Digital 2
なので
・2pin:1KΩ(静電気防御用、抵抗の先にタッチパッド)
・4pin ~ 2pin間:10MΩ
てっきりAnalog Pinを使うものと思っていたらDigital Pinなんですね~
その内、動作原理も調べてみたいです。
回路図もFritzingで。
スケッチを書き込むと...お~っ!動きました!
実態は、こんな状態。タッチパッドは、ただのアルミ箔です。
下に敷いているのは、PCからの影響があるかもしれないので、お菓子の缶の蓋。
動画で
PC画面は、シリアルモニタ  左:cs、右:csSumです。
RESET直後は、数値が2桁なのですが
一旦触ると、触っていない時の数値がぐんと上がって
300~500や1000以上にもなってしまい不安定です。
まあ、確実に触れた時は、10000~20000になるので
ON/OFFスイッチとしては、問題はないですが、ちょっと気に入らないですね~

そこで、これの出番です。
だいぶ前に作ったPCBスパイラルコイル、実は、コイルではなくて、
PIC用にと作っていたタッチパッドだったのですが、
PICで出番が来る前に、ArduinoのCapacitive Sensingを見つけたわけでして。
二重のコイル状になっていてGNDとSensing端子に繋いで
いい感じだったのですが
しばらくすると、振れていないのにこの数値
下の金属板をArduinoUNOのGNDに接続して、片方の手で金属板をつかんで、
もう一方の手でタッチパッドに触れるようにすると、
触れていない時の数値は低いまま安定しています。

ちなみ下の金属板をGNDと接続しただけでは、少し安定するようですが、
何度かやっていると、触れない時の値が増えていきます。

触れてない時は、浮遊容量だけで動作しているからだろうか?
パッドと並列に22pFのセラミックコンデンサ(右下)を入れてみます。
少~し安定した感じもするくらいであまり変わりませんね~
一旦、指を近づけると触ってない時の値が300~500に跳ね上がります。
Arduino UNOをRESETすると2桁に戻ります。

22pF⇒56pFにしてみます。
回路図は、これ
触っていない時の計測時間が30~31msecに伸びますが
お~いいですね~
触れたり離したりしても、触れない時の値は安定するようになりました。
Arduino IDEの環境設定で文字の大きさを36pointにしています。
動画で
前の下の金属板をGNDに接続して、片方の手で金属板をつかんで、
もう一方の手でタッチパッドに触れるようにする場合は、安定していて
しかも計測時間は、56pFを入れてない時と変わらず10以下なのです。
どうも何かの誘導ノイズも影響しているようです。
両面基板の裏をGND、表にタッチパッドというものを作ってもいいかもです。

次に、先の英語のサイトの下の方にある
Example code: Threshold のを少し変えてやってみます。
7_8 ⇒ 4_2 に変えます。(前の配線と同じにするため)
TriggerしたらArduino UNOの「L」のLEDをトグルで点灯させます。
マーティーなりの解釈で日本語コメントを入れました。
*****
#include <CapacitiveSensor.h>
CapacitiveSensor cs_4_2 = CapacitiveSensor(4,2);
     //2pin:センシング  2-4pin:10MΩ
unsigned long csSum;
int LED_State = LOW;

void setup() {
    Serial.begin(9600);
    pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
    CSread();
}

void CSread() {
    long cs = cs_4_2.capacitiveSensor(80);
      //a: Calibration時の読取値からの増分をサンプル数80でサンプリングした合計値
 if (cs > 200) {
      //b: csが200を超えるとSerialに数値を出力する
   csSum += cs;
      //csがb(200)を超えている間は、LOOPする毎にcsSumに加算していく
// Serial.println(cs);
    Serial.print(cs); 
    Serial.print("\t");
    Serial.println(csSum); 
     if (csSum >= 50000)
      //c: csがb(200)を超え続けて加算されたcsSumがc(50000)を超えるとTriggerと判定する
     {
        Serial.print("Trigger: ");    //Serialに"Trigger"文字を出力
        Serial.println(csSum);        //Triggerした時のcsSum値をSerialに出力

        if (LED_State == LOW){ // Current State LOW
          digitalWrite(LED_BUILTIN, HIGH);
          LED_State = HIGH;
        } else { // Current State HIGH
          digitalWrite(LED_BUILTIN, LOW);
          LED_State = LOW;
        }

          if (csSum > 0) { csSum = 0; } //Triggerしたら一旦csSumをClear(Reset)
            cs_4_2.reset_CS_AutoCal();    //読み取り停止してCalibration実行
     }
  } else {
    csSum = 0;
     //パッドから離れてcsがb(200)を下回るとcsSumをClear
     //又は、抵抗がなかったり、容量が大き過ぎて読み取りがTimeoutした場合
  }
}
*****
動画で
Sensing端子の抵抗の足に、指をギリギリまで近づけていくと(0.5~1mm)
200を超えれば左の数値(cs)が表示され、
右側のカウント値(csSum)が加算されていき
50000を超えるとトリガーがかかります。
途中で離れるとカウントされなくなり、csSumがClearされます。
一気に振れるとすぐに50000を超えてTriggerがかかります。
Arduino UNOの一番右のLEDがトグルでON/OFFしています。
なかなか面白いです。
PICの機能では、細かくで設定できなかったので、Arduinoの方が応用がよさげです。
んで、この前のワンボタン・スクリーンショット!を
Digispark(ATtiny85の小型Arduino)とタクトスイッチで作りましたが
人間というものは更に楽を求めるもので
ボタンを押すのではなくタッチだけでできるんじゃないかな~っと

まずは、Digisparkの使えるPINを探します。
Digistump CreatedのDigispark回路図は、このPDFです。
Capacitive Sensingに使えそうなのは、Board内に何もぶら下がっていない
PB0、PB2、PB5ですね。

・Send Pin:PB0
・ReceivePin:PB2
として
・2pin:1KΩ(耐静電気用、抵抗の先にタッチパッド)
・1KΩの先~GND間:56pF
・0pin ~ 2pin間:10MΩ
Digispark Board内には、PB1にLEDが付いているので
Arduino UNOのスケッチからの変更は、2つ
・4 ⇒ 0
・LED_BUILTIN ⇒ 1
ブレッドボード
回路図です。
Fritzingなかなか便利です。
*****
#include <CapacitiveSensor.h>
CapacitiveSensor cs_0_2 = CapacitiveSensor(0,2);
     //2pin:センシング  2-0pin:10MΩ
unsigned long csSum;
int LED_State = LOW;

void setup() {
    Serial.begin(9600);
// pinMode(LED_BUILTIN, OUTPUT);
    pinMode(1, OUTPUT);
}

void loop() {
    CSread();
}

void CSread() {
    long cs = cs_0_2.capacitiveSensor(80);
      //a: Calibration時の読取値からの増分をサンプル数80でサンプリングした合計値
 if (cs > 200) {
      //b: csが200を超えるとSerialに数値を出力する
   csSum += cs;
      //csがb(200)を超えている間は、LOOPする毎にcsSumに加算していく
// Serial.println(cs);
   Serial.print(cs); 
   Serial.print("\t");
   Serial.println(csSum); 
     if (csSum >= 50000)
      //c: csがb(200)を超え続けて加算されたcsSumがc(50000)を超えるとTriggerと判定する
     {
        Serial.print("Trigger: ");    //Serialに"Trigger"文字を出力
        Serial.println(csSum);        //Triggerした時のcsSum値をSerialに出力
        if (LED_State == LOW){ // Current State LOW
//       digitalWrite(LED_BUILTIN, HIGH);
          digitalWrite(1, HIGH);
          LED_State = HIGH;
        } else { // Current State HIGH
//       digitalWrite(LED_BUILTIN, LOW);
          digitalWrite(1, LOW);
          LED_State = LOW;
        }
          if (csSum > 0) { csSum = 0; } //Triggerしたら一旦csSumをClear(Reset)
            cs_0_2.reset_CS_AutoCal();    //読み取り停止してCalibration実行
     }
  } else {
    csSum = 0;
     //パッドから離れてcsがb(200)を下回るとcsSumをClear
     //又は、抵抗がなかったり、容量が大き過ぎて読み取りがTimeoutした場合
  }
}
*****

この前、Digispark用のボードマネージャー(開発環境パッケージ)を入れた、
Arduino IDE v1.8.3を起動してスケッチを書き込みます。
Digispark(ATtiny85)は、先に接続してはいけません。
[ツール]-[ボード]-[Digispark(Default - 16.5mhz)]を選択します。
[ツール]-[書込装置]-[Micronucleus]を選択します。
[ファイル]-[新規ファイル]して
上のスケッチを貼り付け、適当な名前で保存してから
[スケッチ]-[マイコンボードに書き込む]します。
コンパイルが終わり、下の欄に
Plug in device now...(will timeout in 60 seconds)」とでたら
Digispark(ATtiny85)をUSBに接続します。
「ボードへの書き込みが完了しました。」と
「Micronucleus done. Thank you!」の表示がでて
「ピポン、ピポン、ピポン」と3回ほど音が出ますが
無事、書き込み完了です。
シリアルモニタを起動しようとしたら、怒られました。
シリアルポートができていません。
デバイスマネージャーには、DigisparkのUSB認識エラーは、でていません。
あっ!
Digisparkは、専用のSerialライブラリを使う必要がありました。

ちょっとUSBSerialをやってみましたが、泥沼にハマりそうなので
シリアルなしでやることにします。
Serialの所を全て削除します。
*****
#include <CapacitiveSensor.h>
CapacitiveSensor cs_0_2 = CapacitiveSensor(0,2);
     //2pin:センシング  2-0pin:10MΩ
unsigned long csSum;
int LED_State = LOW;

void setup() {
    pinMode(1, OUTPUT);
}

void loop() {
    CSread();
}

void CSread() {
    long cs = cs_0_2.capacitiveSensor(80);
      //a: Calibration時の読取値からの増分をサンプル数80でサンプリングした合計値
 if (cs > 200) {
      //b: csが200を超えるとSerialに数値を出力する
   csSum += cs;
      //csがb(200)を超えている間は、LOOPする毎にcsSumに加算していく
     if (csSum >= 50000)
      //c: csがb(200)を超え続けて加算されたcsSumがc(50000)を超えるとTriggerと判定する
     {
        if (LED_State == LOW){ // Current State LOW
          digitalWrite(1, HIGH);
          LED_State = HIGH;
        } else { // Current State HIGH
          digitalWrite(1, LOW);
          LED_State = LOW;
        }
          if (csSum > 0) { csSum = 0; } //Triggerしたら一旦csSumをClear(Reset)
            cs_0_2.reset_CS_AutoCal();    //読み取り停止してCalibration実行
     }
  } else {
    csSum = 0;
     //パッドから離れてcsがb(200)を下回るとcsSumをClear
     //又は、抵抗がなかったり、容量が大き過ぎて読み取りがTimeoutした場合
  }
}
*****
書き込み完了です。
一旦、Digisparkを取り外して
・2pin:1KΩ(耐静電気用、抵抗の先にタッチパッド)
・2pin~GND:56pF
・0pin ~ 2pin間:10MΩ
を配線して、USBに挿します。

おっ!タッチセンサー動きました!!!
が、
そのまま放置していたら
手は、最低でも10cmは離れているのにLEDが点灯することがあります。
csSumに加算を始める閾値を上げます。
*****
 if (cs > 1000) {
      //b: csが1000を超えるとSerialに数値を出力する
*****
触ってから反応するまでのディレイが長めなので
*****
     if (csSum >= 20000)
*****
いい感じになりました!

スクリーンショットのスケッチ(青文字)を合体しました。
Triggerがかかったら一瞬、内蔵LEDも光らせることににました。
*****
#include <CapacitiveSensor.h>
#include <DigiKeyboard.h>
#define KEY_PRINT_SCREEN 0x46
CapacitiveSensor cs_0_2 = CapacitiveSensor(0,2);
     //2pin:センシング  2-0pin:10MΩ
unsigned long csSum;
int LED_State = LOW;

void setup() {
    pinMode(1, OUTPUT);
    digitalWrite(1, LOW);
}

void loop() {
    CSread();
}

void CSread() {
    long cs = cs_0_2.capacitiveSensor(80);
      //a: Calibration時の読取値からの増分をサンプル数80でサンプリングした合計値
 if (cs > 1000) {
      //b: csが1000を超えるとSerialに数値を出力する
   csSum += cs;
      //csがb(1000)を超えている間は、LOOPする毎にcsSumに加算していく
     if (csSum >= 20000)
      //c: csがb(1000)を超え続けて加算されたcsSumがc(20000)を超えるとTriggerと判定する
        {
         digitalWrite(1, HIGH);
         DigiKeyboard.update();
         DigiKeyboard.sendKeyStroke(KEY_PRINT_SCREEN, MOD_GUI_LEFT);
         DigiKeyboard.delay(50); 
         digitalWrite(1, LOW);
          if (csSum > 0) { csSum = 0; } //Triggerしたら一旦csSumをClear(Reset)
            cs_0_2.reset_CS_AutoCal();    //読み取り停止してCalibration実行
        }
        } else {
           csSum = 0;
     //パッドから離れてcsがb(1000)を下回るとcsSumをClear
     //又は、抵抗がなかったり、容量が大き過ぎて読み取りがTimeoutした場合
  }
  DigiKeyboard.delay(10);
}
*****
まず、コンパイルだけすると。
このスケッチで77%です。
USBのBootloaderがなかなか認識してくれない時もあり不安定です。
書き込みエラーになるとArduino IDEを再起動しないといけないし
USBポートを変えたり、何度もしつこく挿し直して
やっと書き込みできました。
書き込み時は、全てのUSBを外しておくのがいいようです。
それでもダメな時はありますが。
実体配線は、この状態です。
できました~!
成功です。
こりゃー良さそうです。
抵抗の先にチョンと触れるとスクリーンショットできます!
静止画ではわからないので、動画を
でも途中から固まっちゃいましたね~  LED付いたままで反応していません。
リード線が長いのがいけないのかなあ~
実は、この前、Digisparkが面白かったので
この元祖タイプの直挿Digispark Cloneもポチっておりました。
最安値 US$ 1.25のここから買ったのですが
今見ると、売り切れですね~
こちらは、まだ売っているようです。価格上昇中なのかなあ?
いつもよりかなり早くて丁度いいタイミングで届きました。
3つも買ってしまっております。
早速チェックすると
既にLチカが入っていました。確認がしやすいので親切ですね~
ATtiny85と78M05(この前のは、78L05でした)
早速、メスのピンヘッダーをハンダ付けして
抵抗2本とセラミックコンデンサをつけました。
赤矢印の抵抗の先っぽを丸めた所がタッチパッド代わりです。
抵抗の先っぽをタッチパッド代りにしたので回路図を少し変えました。
静電気が心配なので1KΩ⇒10KΩにしています。
マーティーPCに取り付けた状態。
他のUSBを全部外して何度か挿さないとなかなか認識してくれませんが
配線を短くしたら動作は安定するようになりました!
差込がやや甘いので強く振れるとUSB給電が一瞬切れてUSB認識が外れます。
一旦USB認識されると
このように便利は便利です。
スクリーンショットの保存フォルダにどんどん溜まっていきます。
動画で
USBの認識さえ問題なければ完璧なのですが、ちょっと悪すぎます。
一度認識してくれればSLEEPから復帰しても大丈夫です。
ただ、復帰時には必ず、自動で一発ショットされます。まあ仕方ないでしょう。

タッチ式はいいですね~
しばらくこの状態で使うことにします。