2018年2月24日土曜日

NTT関連の電話料金を調べる

先日インターネット回線を取り替えたときに、我が家には数年間使われていないADSL回線があることが判明しました。

どうも元々のADSL回線を速いADSLに契約変更をした時に、古い契約が解除されていなかった模様。

解除するには電話番号 / 回線番号が必要だけど、クレジットカードの引き落としには「99月99日 NTT東日本(99月分) 9,999,999円」としか書いてない。電話番号はともかく昔使ってたインターネットの回線番号なんてわからんがな。

ってことで、ちょっとたらい回しになりましたが、なんとかわかりました。私は昔ちょっと会社をやっていましたが、その名義のままだったりかみさん名義の回線があったりで大騒ぎでした。

調べ方としては、まずNTTファイナンスに電話(0800-3330111:フリーダイヤル)して、本人確認などの後、クレジットカードの名義、カード番号、何月分の金額がいくらか、ということを伝えます。その場ですぐにはわからないので折り返し電話をもらいます。これで電話番号 / 回線番号を教えてもらえます。

次にNTT東日本に電話します(これもフリーダイヤル)。番号がわかれば簡単。本人確認と契約者名義(複数あるのでこれ?それともこっち?といくつか並べてもOK)と番号を伝えると、その回線の契約内容を教えてもらえます。これでようやく今使っていない回線が判明しました。完全に前のADSL担当のミスじゃねーかよ(苦笑)。

あとは、解約手続きです。何故かその回線の名義がツマだったので、ツマから連絡してもらいます。いやはや。

今回、116担当の方には本当にしっかりとサポートしていただきました。なんとか調べる方法がないか相談したところ、こういう方法があるということを教えてくださり、NTTファイナンスの担当さんに電話を直接転送して、結果として解決することができました。

…しかし、数年間数千円ずつ払いつづけてきた料金は戻ってこないんですよね。ざっと30万円ぐらいです。しくしく。

あと、電話だと本人確認の後で教えてもらえるのですが、私は聴覚障害者で電話できず、Webで調べたりしたものの文書のやり取りが必要で遅々として進みませんでした。しかし、iPhoneとBluetoothと接続可能な補聴器Widex Beyondを使ったので、普通の人と同じように電話できるようになり、数時間で解決できました。私は補聴器なしだと「いち」と「はち」、「さん」と「よん」を聞き分けできないレベルの感音障害なので、この補聴器なしだと例えば電話番号を教えてもらうのに一桁ごとに「えー? 2ですか? ツー?」てな落語のようなやり取りをしなければいけないんですが、先方がプロの電話仕事人ということもあってか、実にスムーズに会話できました。

補聴器変えた直後は耳に合わずに苦労したのですが、周波数特性などを念入れに調整していただいたおかげでここまで便利になりました。補聴器の調整にご尽力くださった眼鏡市場吉祥寺店の店長さん、心よりお礼申し上げます。

PmodMTDSループ



ちょっとマルチタッチ液晶ディスプレイでデモを作りたくて、PmodMTDSを物色

→事前にArduinoのサンプルがビルド通ることを確認。ソースを見ても他CPUへの移植はそんなに難しくなさそうだなと判断して注文

買ったのはShield版ではないですがArduino unoで動きました。

デモを動かすには別途microSDカードが必要です。

配布されているFAT32でフォーマットしたSDカードにダウンロードしたArduino版ツールを解凍するとDocumentation, Libraries, Resources, Sketchesフォルダがあります。

Resources下にある2つのフォルダごと画像をコピーしてmicroSDのルートにコピーして、MTDSにセットします。

もしArduino IDEが起動していたら終了し、Arduinoのlibraryフォルダの下にMTDSというフォルダを作り、その中にLibraries下の2つのフォルダの中身をコピーします。

Sketches下の.pdeを.inoにrenameしてダブルクリックすればArduino IDEが起動します。念のためですが、結線前のArduino unoにコードをダウンロードしておいてから結線します。

MyDispDemo1は表示だけ、2は読み込み後☆をタップすると画像が変わる、3は待ち時間wheelを表示した後でボタンをタップすると画像が変わる。3にはチェックボックスっぽいボタンが表示されているのでいろいろ期待しちゃうんだけど、ただのデモみたいっすね。

あmicroSD上の画像の処理はぜんぶPmodMTDS上で行われます。でも画像の書き換えは遅いですね。書き換えているところが目に見えます。MTDS上のCPUはPIC32なのでそんなに遅くないはずなんですが。

あとでArduinoより速いCPUでも試してみようと思ってRaspberry pi用のPmodHATも注文してしまったんですが、無駄になっちゃいましたね…。

以下はPmodMTDSとArduino unoとの結線図。

PmodMTDSArduino uno
P1 : ~CSdigital 10
P2 : MOSIICSP4 : MOSI
P3 : MISOICSP1 : MISO
P4 : SCLKICSP3 : SCK
P5 : GNDGND
P6 : VCC3V3
(下段 : NC)


2018年2月10日土曜日

ArduinoでSG90をゆっくり滑らかに動かしたい(失敗)



サーボSG90を20度/秒ぐらいで滑らかに動かしたいと思ったのですが、どうも難しいです。割り箸をホットボンドで接着するといういかにも共振したりハンチング起こしそうな条件ではありますが。

試行錯誤としては、
  • Arduino標準のServoライブラリのexample
  • 同じく、値を変えるごとにdetachしてdelayし再度attach
  • ESP32のLEDCを使って15bit PWM
  • ESP32 / Arduino unoでdelayMicrosecondsを使って正確なパルスを出す
などを試みたのですが、いずれも動画のようなブルブルっぷりでした。強いて言えばLEDCを使ったものが一番良かったですが、やっぱり震えます。今回使ったのはSG90のパチ品です。本物あるいはもっと高価なサーボを使えば滑らかに動いてくれるのでしょうか?

うーむ。

一応LEDC版のソースです。delayは「次のPWMパルスが出そうなところでledcWrite命令を出すとパルス列がコケるのではないか?」ということで一つだけ出るようなタイミングにしてみたりPWM周期を変えてみたりしましたが特に大きな変動は見られません。
#define servoPin 12
#define servoCh 0
#define servoBits 15
#define servoMax 32767
void degreeToLED(float inDegree) {
float msec = inDegree / 90.0 * 0.5 + 1.5;
int duty = msec / 20.0 * (float)servoMax;
Serial.println(duty);
ledcWrite(servoCh, duty);
}
float pos = 0;
void setup() {
Serial.begin(115200);
ledcSetup(servoCh, 50, servoBits);
ledcAttachPin(servoPin, servoCh);
}
void loop() {
for (pos = -90; pos <= 90; pos += 0.1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
degreeToLED(pos); // tell servo to go to position in variable 'pos'
delay(15);
}
for (pos = 90; pos >= -90; pos -= 0.1) { // goes from 180 degrees to 0 degrees
degreeToLED(pos); // tell servo to go to position in variable 'pos'
delay(15);
}
}
view raw SG90_Slow1.ino hosted with ❤ by GitHub

こっちはdelayMicroseconds版。
#define servoPin 12
void setup() {
Serial.begin(115200);
pinMode(servoPin, OUTPUT);
}
void loop() {
for (float pos = -90; pos <= 90; pos += 0.1) {
float msec = pos / 90.0 * 0.5 + 1.5;
long limitUSec = msec * 1000;
digitalWrite(servoPin, HIGH);
delayMicroseconds(limitUSec);
digitalWrite(servoPin, LOW);
delayMicroseconds(10000-limitUSec);
delay(10);
}
delay(1000);
}
view raw SG90_Slow2.ino hosted with ❤ by GitHub

2018年2月5日月曜日

Arduino nanoで肩こり対策デバイス・その2


■原理■

同僚さんから、「肩こりがひどいので電子工作で何かできないか」というご相談をいただいて作ってみたシリーズ第二弾です。第一弾は首肩の傾斜で振動するパターンでした。

今度は「ふと気がつくとモニタに近づきすぎている。近づいたら警告を」というデバイスです。モニタの上端に貼り付けて使います。

距離計測は超音波とToFを試してみたのですが、超音波は人間の顔だとあまりうまいこと検出できず、手持ちのToFは計測レンジが微妙に遠くてNG。シャープの赤外線距離測定デバイスを使うことにしました。

■製作■

Arduino nanoのパチを使いました。

距離センサー

表示にはNeoPixels / WS2812b的なLED

回路は、それぞれのGND同士をつなぎ、ArduinoのVinとセンサーとNeoPixelsの電源同士をつなぎます。距離センサーは最大約2.8vのアナログ出力なのでアナログ入力A0、ArduinoのA1とNeoPixelsのDinをつなぎます。

今回、0.19mmのエナメル線で配線しました。ワイヤリングペンも作ったので、GND-GND-GNDとつながるような場所が大変楽です…と言いたいところですが、所要時間的には架橋ポリエチレン被覆線とあんまり変わらなかったです。



ワイヤリングペン、シャープペンに通すのに例によって30cmほどに切ったワイヤを先端から差し込んで後ろの本体と接合して引っ張り出す作戦を取りました。が、前回は0.3mmだったので突き合わせでハンダ付けできたのですが、今度は0.19mm、さすがに細くて無理だったので、瞬間接着剤使いました。この時期は空気が乾燥しすぎていてなかなか固まらないので困ったもんです。今度、接着促進剤ってのを使ってみたい。

見た目は悪いけど使い勝手は良いですw


■プログラム■

起動したら、5秒間距離を計測して平均値を取ります。これが基準値で、これより近づいたら=値が大きくなったらLEDを点灯させます。

loop()ではanalogReadからの値を簡易的な移動平均処理で測定誤差をツブして無駄なチラツキを減らしています。距離センサーからの値は最大で500ぐらいなので、上記の平均値と500との中間点までは黄色、それを越えて近づいたら赤で点灯するようにしました。


#include <Adafruit_NeoPixel.h>
#include <TimeLib.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN A1
#define Distance A0
#define MaxValue 500
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_RGB + NEO_KHZ800);
int prevSecond = -1;
int aveValue = 0;
int halfValue = 0;
void setup() {
// This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
// End of trinket special code
Serial.begin(115200);
strip.begin();
strip.show(); // Initialize all pixels to 'off'
int nAverage = 0;
while (1) {
if (prevSecond != second()) {
prevSecond = second();
strip.setPixelColor(0, strip.Color(255, 255, 255));
strip.show();
delay(50);
strip.setPixelColor(0, 0);
strip.show();
aveValue += analogRead(Distance);
nAverage ++;
if (nAverage >= 5) break;
}
delay(10);
}
aveValue = aveValue / nAverage;
halfValue = (MaxValue - aveValue) / 2;
}
int roundValue = -1;
void loop() {
// put your main code here, to run repeatedly:
if (roundValue == -1) {
roundValue = aveValue;
}
roundValue = (roundValue * 9 + analogRead(Distance)) / 10;
int diff = roundValue - aveValue;
Serial.print("ave = ");
Serial.print(aveValue);
Serial.print(", dif = ");
Serial.println(diff);
if (diff > halfValue) {
strip.setPixelColor(0, strip.Color(255, 0, 0));
} else if (diff > 0) {
strip.setPixelColor(0, strip.Color(128, 128, 0));
} else {
strip.setPixelColor(0, 0);
}
strip.show();
delay(10);
}