MVNO検討

A.検討編

自分のスマホの更新タイミングになってきたので、MVNOに入れ替えた子供の回線なども含めて4回線分をどうしようかと色々と検討しています。今日はそんな話。

1.条件
現状の保有回線は、キャリアが2回線、MVNOが2回線の計4回線。うち、子供のスマホは5年落ちのAndroid4で色々支障が出てきているので機種変更が必要な状態。
他は、2-3年落ちクラス。

2.キャリアへのMNPの検討
4回線いっぺんにどっかのキャリアにMNPすれば結構安くなりそうな気もしたけど、縛りと月額が気になって早々に検討中止。

MVNOだと3GBでおおよそ月1,600円なので、年で19,200円、消費税(10%w)も入れると21,120円になり、2年で42,240円前後となる。そこに新規申し込みのキャンペーンが入ると、さらに5,000~15,000円位安くなる。4回線2年間で12~15万円ぐらい。
キャリアだと月5~6,000円になるので2年で約14万円、4回線分だと56万円!なのでものすごい差。iPhone8で8万円のキャッシュバックがあってトントンだけど、48分割とかw 現状は一括が無いのが悲しい。

3.格安スマホキャンペーンの検討
MVNOのキャンペーン調査はもう1か月ぐらい続けていて、スマホが格安で手に入るOCNモバイルのキャンペーンでnova lite 3 やSH-M08が3800円とかかなり魅力的だった、でも手が出なかった。

なぜか?
一つ目は、対象のスマホの性能。
格安になるスマホの性能は、キャリアの最新機種の3世代型落ちにも性能は届かない。レンズが複眼化とかAIカメラとか機能は良くなっているのだろうけどね・・・iPhoneが良い例で、iPhone6SとかiPhone7がまだまだ現役、下手するとiPhoneSEでも安いスマホよりも性能が良いってことなる。
つまり、そんなスマホを安く手に入れても長持ちしない可能性あるのと、キャリアで最新機種を使ってきた場合は、性能がガタ落ちという結果が待っている・・・結果MVNOだめ、ってなったりして。
(実際のところ、nova lite 3とかでも良いんだけどね・・・特に古い機種使っている子供なら)

二つ目は、OCNモバイルはベース金額が高いってところ。
元々3GB 1,800円だから、2年間320円引きキャンペーンでやっと他のMVNOの通常回線費用と同じになるレベル。
つまり、nova lite 3 を3,800円で購入できた、と思っても、一番安いMVNOの2年間費用との差分がでて最悪18,000円位で購入したイメージになる。

最初から、そういった機種狙いなら問題は無いんですけどね。
これから先も使い続けていくことを考えるとできるだけ性能の良いものにしておきたい、それもできるだけ安く。

4.結果
4.1 回線
4回線のうち、2回線は一番安くなるBiglobeモバイル。一番スマホを使う子供はLINEモバイル。
オサイフケータイやら色々活用しているもう1回線は、現状維持、といった感じになった。

4.2 スマホ
色々考えた結果、自分用に Xperia XZ2の中古を購入、今使っている Xperia XZ を、子供に譲ることに。

Xperia XZ2は、2018年5月発売のSnapdragon 845搭載の高性能機種。ただし、評判はイマイチw。
最新機種の1年型落ちなのに25,000円位で購入できた。もう1つ新しいXZ3なら35,000円以上かな。
さらに今回は、SIMフリー化された傷の無い美品。SIMフリー化されているとMVNOで、どこのキャリア回線でも使えるのでベスト。利用制限×になっても他のキャリア回線で利用可能なので問題が無い。
さっき計算した18,000円で新品のnova lite 3と比較しても全然良かった。

Xperia XZは、2016年11月発売のSnapdragon 820搭載の機種。子供が使っている機種からすると3~5倍の性能。まだまだ現役。※カメラはちょっとひどいけど。
XZを買ってから2年あっという間、でも性能はそんなに悪くない。

5.色々
安さと利便性を調整するのが大変だったw


しかも、子供にはiPhoneに良かったって言われてしまう始末・・・orz
自分だけ新しいって、やっぱズルいよな。

1年後には全員キャリア回線へMNPできそうだから、その時に一括0円キャンペーンがあれば、光回線も合わせて変えてまとめてiPhoneかな。(;^ω^)

それまで、そういったキャンペーンが一掃されないように願ってます。

# もうiPhoneの一括0円はなさそうですね・・・


ESP32でWebからモーター制御 L293D

ESP32シリーズの続きです。

その前に、Fritzingのパーツは、頑張ってGitHUBで公開して、Qiitaで他のESP32のパーツと合わせて紹介しました。

さて、前回、DHT11を使用した温度計、湿度計を試してました。ただ表示しているだけなんだけど、なんかうれしくて、ずっと電源入れっぱなしにしていたりして楽しんでいました。

そろそろ次に進まないと、と、DCモーターの制御を試してみます。
記事にはしていないけど、サーボモーターとかと一緒に以前試してみたのだけど、動作してもあまりうれしいことが無くて放置していました。で、今回は、DCモーターからやり直しです。

DCモーターの実験の目的は、マスコットロボ ハロの耳を動かすこと。
写真の通り、ハロの前側の下にモーターがついています。ここの制御をESP32からやってみるのが最終目標です。


DCモーターの制御ということで、モータードライバが必要となります。今回は、ArduinoのキットについていたL293D を使用します。
 モータードライバが必要なのか?と思って調べてみると、モーターの回転の正方向、逆方向の制御や回転速度の制御、電源関連など苦労するものが多いということが分かったので、素直にモータードライバを使用することにしました。

プログラムはサンプルと、参考サイトのコードを利用しています。

DCモーターとL293Dのサンプル参考サイト:
https://randomnerdtutorials.com/esp32-dc-motor-l298n-motor-driver-control-speed-direction/

Webサーバの参考サイト:
http://mukujii.sakura.ne.jp/esp1.html
https://lastminuteengineers.com/esp32-dht11-dht22-web-server-tutorial/

接続図は下記のような感じ。
電源は両方投入しないといけない。

そして、まだ書きかけの汚いコードだけど、載せておきます。
モーターの frequency が良くわかっていない。


#include <WiFi.h>

// WiFi
const char* ssid     = "ssid";
const char* password = "password";

// WiFi Server
WiFiServer server(80);
String header;  // HTTPリクエストを格納する変数

// Motor Pin
int motor1Pin1 = 27; 
int motor1Pin2 = 26; 
int enable1Pin = 14; 

// Setting PWM properties
const int freq = 1000;
const int pwmChannel = 0;
const int resolution = 8;
int dutyCycle = 200;

void setup() {
  // sets the pins as outputs:
  pinMode(motor1Pin1, OUTPUT);
  pinMode(motor1Pin2, OUTPUT);
  pinMode(enable1Pin, OUTPUT);
  
  // configure LED PWM functionalitites
  ledcSetup(pwmChannel, freq, resolution);
  
  // attach the channel to the GPIO to be controlled
  ledcAttachPin(enable1Pin, pwmChannel);

  Serial.begin(115200);

  // WiFi Connect
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // ローカルIPを表示(このIPにスマホなどからアクセスします)
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  server.begin();

}

String SendHTML() {
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>ESP32 DCMoter</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
  ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<div id=\"webpage\">\n";
  ptr +="<h1>ESP32 DCMoter Web</h1>\n";
  
  ptr +="<form method='get'>\
<input type='submit' name='le' value='耳停止' />\
<input type='submit' name='ri' value='耳動作' /><br>\
<input type='submit' name='st' value='停止' /><br>\
<br>\
</form></div>";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

void MoterStop() {
  Serial.println("Motor stopped");
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, LOW);
}

void  Forward() {
  Serial.println("Moving Forward");
  digitalWrite(motor1Pin1, LOW);
  digitalWrite(motor1Pin2, HIGH); 
  delay(800);
}

void loop() {
  ledcWrite(pwmChannel, dutyCycle);   
//  Motor();
//  Forward();
  
  WiFiClient client = server.available();

  if (client) {
    Serial.println("New Client."); 
    String currentLine = "";             // make a String to hold incoming data from the client
    while (client.connected()) {         // loop while the client's connected
      if (client.available()) {          // if there's bytes to read from the client,
        char c = client.read();          // read a byte, then
        Serial.write(c);                 // print it out the serial monitor
        if (c == '\n') {                 // if the byte is a newline character
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println();

            client.print(SendHTML());
            client.println();
            // break out of the while loop:
            break;
          } else {    // if you got a newline, then clear currentLine:
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /?le")) {
          Forward();
          MoterStop();
        }
        if (currentLine.endsWith("GET /?ri")) {
          Serial.println("");
          Serial.println("Moving Backwards");
          digitalWrite(motor1Pin1, HIGH);
          digitalWrite(motor1Pin2, LOW); 
        }
        if (currentLine.endsWith("GET /?st")) {
          Serial.println("");
          MoterStop();
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}


実際にマスコットロボ ハロの耳を動かすのは、次回。