最近の格安スマホ事情
2019.03.11


最近「携帯を変えたいんだけど安いところはどこ?」と聞かれることが多いです。
自分のスマホを変えてから、まったく調査してなくて的確な助言ができなかったのでですが
すこし時間に余裕ができたので調べてなおしてみました。
繋がりやすさや、速度なども重要になってきますが、
これは実際に契約してみないとわからないのでここでは加味しないことにします。
ネット情報はステマも多いしね。

端末はそこそこ安くて文句の出にくい5インチ以上のミドルスペック。
メーカーは個人情報絡みのニュースがでたらこちらに飛び火するのが目に見えてるので
そこそこ信頼できる(今は台湾だから怪しさは拭えないが)SHARPで試算しました。
携帯の分割/一括の価格で赤字と黒字になってる部分がありますが
赤字のほうがお得という意味です。青字と赤字はどっち選んでも一緒。
個人的にはどんな時も一括で買うことを勧めますね。



CMでUQがバンバン流れてますが思っていたほど安くない印象。
安さではIIJmioとビッグローブがぶっちぎりですね。
通話だけのスマホならワイモバイルがやすいように感じますが、
IIJmio/ビッグローブ + 896円のかけ放題 VS ワイモバイル 3218円では
ワイモバイルは勝ち目がありません。データ量も2GBしかないしね。
mineoも安い。契約するときの煩雑さや端末の値段を無視できるなら
アリだと思うがキャンペーンの割引が微妙なので今の時期は薦められない。
楽天も安いように見えるけど、キャンペーン期間が過ぎたとたん
ドカンと値上がってしまいそうな恐怖が潜んでいる。
しかも想定外のことが絶対に起きないと言い切れる文言が
楽天モバイルのページから見つけ出せないので
MVNO慣れしている私でも手が出にくい。知り合いに薦めるなんてとてもとても。
コスパだけで最強を選ぶならビッグローブ
Youtubeをよく見る人ならこれしか選択肢がないとも言える。
動画使い放題のオプション(518円)の威力は絶大です。
ドコモ端末を持っていて、それをそのまま使うというのであれば最強だと思います。
端末は購入、だけど動画は見ないというのであればIIJmioが一番安いかな。
Arduino 9-1) 4連 Digital Tube LED Displayの点滅問題を考える
2019.03.03
その後、いろんな角度からテストをしてみました。

まず、5, 6ピンを使うとmillis(), micros(), delay(), delayMicroseconds()などの関数が正常に動かなくなるという情報をネットでみたので、接続するピンを
#define SCLK 4
#define RCLK 7
#define DIO 8
としてみる。
失敗

電源をUSB供給から電池に変えてみる。
失敗

Deleyの代わりにmillisを使ってみる。
Deleyのように簡単に使えるようにするため
void milliswait(int loop_i){
old_time=millis(); //最新の実行時間を保存
while (millis() - old_time < loop_i);
}

このような関数を作って実行してみた。
どうやらDelayが悪いのではなく、
処理能力が低下すると高速書き換えができなくなるだけのことだった。
複雑な処理を乗せるとDelayじゃなくても起きる現象ということで
失敗

先人のライブラリを使ってみる。
TM74HC595で検索すると結構使ってる人がいるもので、
Youtubeに投稿してる人も何人かいました。
https://www.youtube.com/watch?v=S_Hnx20GzGs
↑この方の意見を全面的に取り入れて試してみます。
https://github.com/kostarev/TM74HC595-4dig-display
にアクセスしてダウンロードしインストール。
ソースコードを書き換えて実行。
同じ症状でした。
失敗

結局の所、ネットで調べ倒して見た結果、
この製品は4キャラクタのうち、1文字を表示した直後、
他のモジュールの文字が消えてしまう仕様のようで
高速に4モジュールを表示し直して、目をごまかすような処理が必要のようだ。
Loop内でDelayを使うとその更新が阻害されるため
点滅したように見えてしまうというのが真実らしい。
これの解決策として、割り込みを利用し
ある一定周期で更新させることができれば、
Loop内だろうがDelayで止めようが
表示は安定するのではというのが最適解のようです。

#include <mstimer2.h>
int Denatu = 0;
int OutNum = 0;


//接続するピンを設定する
#define SCLK 4
#define RCLK 7
#define DIO 8


byte digitBuffer[4]; //キャラ数(文字数を設定)この配列に入れた数字がそのまま表示される。

void setup(){
Serial.begin( 9600 ); //シリアルモニタを使うときの儀式
pinMode(13, OUTPUT); //ボードのLEDを使用する
pinMode(RCLK, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(DIO, OUTPUT);
MsTimer2::set(1, showDisplay); // 1msの周期で結果を4LEDに表示
MsTimer2::start();
}


void loop(){
digitalWrite(13, HIGH); //LEDを光らせる
Denatu = analogRead(0); //A0ピンの電圧を測る0(0V)~1023(5V)
Serial.println(Denatu); //シリアルモニタに値を出力
OutNum = Denatu;


//4文字目に数字を表示
digitBuffer[3] = OutNum % 10; //10で割ってあまりを求める。
OutNum = OutNum / 10; //値を10で割って結果を元の数字に返す。これで4ケタが3ケタにシフトする。

//3文字目に数字を表示
digitBuffer[2] = OutNum % 10; //10で割ってあまりを求める。
OutNum = OutNum / 10; //値を10で割って結果を元の数字に返す。これで3ケタが2ケタにシフトする。

//2文字目に数字を表示
digitBuffer[1] = OutNum % 10; //10で割ってあまりを求める。
OutNum = OutNum / 10; //値を10で割って結果を元の数字に返す。これで2ケタが1ケタにシフトする。


//1文字目に数字を表示
digitBuffer[0] = OutNum % 10; //10で割ってあまりを求める。


delay(Denatu); //読み取った値分処理を止める1023=1.023秒
digitalWrite(13, LOW); //LEDを消す
delay(Denatu); //読み取った値分処理を止める1023=1.023秒
}


//表示するために関数を定義
void showDisplay(){
const byte digit[10] = {
0b11000000,//0
0b11111001,//1
0b10100100,//2
0b10110000,//3
0b10011001,//4
0b10010010,//5
0b10000010,//6
0b11111000,//7
0b10000000,//8
0b10010000 //9
};
const byte chr[4] = {
0b00001000,//1
0b00000100,//2
0b00000010,//3
0b00000001,//4
};


for(byte i = 0; i <= 3; i++){
digitalWrite(RCLK, LOW);
shiftOut(DIO,SCLK,MSBFIRST, digit[digitBuffer[i]]);
shiftOut(DIO,SCLK,MSBFIRST, chr[i]);
digitalWrite(RCLK, HIGH);
delayMicroseconds(1);
}
}


最初の実験の影響で、ピンの位置を先日のものと変えています。注意。
そして実行



イエ━ヽ(*´∇`)人(´∇`*)━ィ!!
ただこの方法、人間には区別はつかないけど高速点滅しているので目には優しくないと思われる。

Arduino 9) 4連 Digital Tube LED Displayを試す
2019.02.28


注文してから1ヶ月以上かかりました。長かった・・orz



左からVCC、SCLK、RCLK、DIO、GND
この5ピンを接続し、SCLK、RCLK、DIOの3ピンで制御します。



基本配線は上記でいいと思います。



どうせなら変化があったほうが面白いので
前回の可変抵抗を読み取って表示することを踏まえて配線しています。



LED文字には各パーツごとに光るようになっています。
それらを組み合わせて人間が数字として読み取れるように
場所を指定し光らせます。
ビットが0なら光る。1なら消えるを意味します。
つまり
0なら 0b11000000
1なら 0b11111001
2なら 0b10100100
3なら 0b10110000
4なら 0b10011001
5なら 0b10010010
6なら 0b10000010
7なら 0b11111000
8なら 0b10000000
9なら 0b10010000
といった2進数コードを使用します。

ではコーディングですが、いちから作るのは面倒なので、
どこぞから拾ってきたものをカスタマイズして仕上げました。

//接続するピンを設定する
#define SCLK 3
#define RCLK 4
#define DIO 5


byte digitBuffer[4]; //キャラ数(文字数を設定)この配列に入れた数字がそのまま表示される。

void setup(){
pinMode(RCLK, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(DIO, OUTPUT);
}


void loop()
{
digitBuffer[0] = 1; //1文字目に1を表示
digitBuffer[1] = 2; //2文字目に2を表示
digitBuffer[2] = 3; //3文字目に3を表示
digitBuffer[3] = 4; //4文字目に4を表示

showDisplay();
}


//表示するために関数を定義
void showDisplay(){
const byte digit[10] = {
0b11000000,//0
0b11111001,//1
0b10100100,//2
0b10110000,//3
0b10011001,//4
0b10010010,//5
0b10000010,//6
0b11111000,//7
0b10000000,//8
0b10010000 //9
};
const byte chr[4] = {
0b00001000,//1
0b00000100,//2
0b00000010,//3
0b00000001,//4

};


for(byte i = 0; i <= 3; i++)
{
digitalWrite(RCLK, LOW);
shiftOut(DIO,SCLK,MSBFIRST, digit[digitBuffer[i]]);
shiftOut(DIO,SCLK,MSBFIRST, chr[i]);
digitalWrite(RCLK, HIGH);
delayMicroseconds(1000);
}
}




無事光りました。
では可変抵抗の値を表示するプログラムに改造してみたいと思います。

int Denatu = 0;
int OutNum = 0;
int StackNum = 0;


//接続するピンを設定する
#define SCLK 3
#define RCLK 4
#define DIO 5


byte digitBuffer[4]; //キャラ数(文字数を設定)この配列に入れた数字がそのまま表示される。

void setup(){
Serial.begin( 9600 ); //シリアルモニタを使うときの儀式
pinMode(13, OUTPUT); //ボードのLEDを使用する
pinMode(RCLK, OUTPUT);
pinMode(SCLK, OUTPUT);
pinMode(DIO, OUTPUT);
}


void loop()
{
//digitalWrite(13, HIGH); //LEDを光らせる
Denatu = analogRead(0); //A0ピンの電圧を測る0(0V)~1023(5V)
if (Denatu != StackNum) { //前回と値が違うときだけ処理を行う


Serial.println(Denatu); //シリアルモニタに値を出力
OutNum = Denatu;


//4文字目に数字を表示
digitBuffer[3] = OutNum % 10; //10で割ってあまりを求める。
OutNum = OutNum / 10; //値を10で割って結果を元の数字に返す。これで4ケタが3ケタにシフトする。

//3文字目に数字を表示
digitBuffer[2] = OutNum % 10; //10で割ってあまりを求める。
OutNum = OutNum / 10; //値を10で割って結果を元の数字に返す。これで3ケタが2ケタにシフトする。

//2文字目に数字を表示
digitBuffer[1] = OutNum % 10; //10で割ってあまりを求める。
OutNum = OutNum / 10; //値を10で割って結果を元の数字に返す。これで2ケタが1ケタにシフトする。


//1文字目に数字を表示
digitBuffer[0] = OutNum % 10; //10で割ってあまりを求める。


//結果を4LEDに表示
showDisplay();
//今回の電圧を記録する。
StackNum = Denatu;
}

delay(Denatu); //読み取った値分処理を止める1023=1.023秒
digitalWrite(13, LOW); //LEDを消す
delay(Denatu); //読み取った値分処理を止める1023=1.023秒


}

//表示するために関数を定義
void showDisplay(){
const byte digit[10] = {
0b11000000,//0
0b11111001,//1
0b10100100,//2
0b10110000,//3
0b10011001,//4
0b10010010,//5
0b10000010,//6
0b11111000,//7
0b10000000,//8
0b10010000 //9
};
const byte chr[4] = {
0b00001000,//1
0b00000100,//2
0b00000010,//3
0b00000001,//4

};


for(byte i = 0; i <= 3; i++)
{
digitalWrite(RCLK, LOW);
shiftOut(DIO,SCLK,MSBFIRST, digit[digitBuffer[i]]);
shiftOut(DIO,SCLK,MSBFIRST, chr[i]);
digitalWrite(RCLK, HIGH);
delayMicroseconds(1000);
}
}


赤字の部分はこの仕組のキモで、
可変抵抗の4ケタまでの数字を分解して4つのLEDに表示する。
プログラマーを長くやっていると定番のアルゴリズムですが、
ここでも役立つとは思いませんでした。
では実行。



表示がオカシイ。
値が1024でも一桁目の4しか正常に表示しない。
他の桁はチカチカしてしまう。
いろいろソースを変えて試してみたけど
Delayで処理を止めるとその間だけ表示も止まっているようだ。

今の所解決方法が見つからない。
よく使われる部品でこんなトラブルとはがっかり(;´Д`)

- CafeNote -