私の入門記録であって、入門者向け解説サイトではありません。

機能追加

  • 投稿日:
  • Category:

さらにスケッチに機能追加を行ない、Web側から強制リセットを行なう為のボタンを追加。及び、ポイント切り替え動作中にフォームを disableにし、動作完了までの間は操作出来ないようにした。

[ スケッチ:SRR_Point_System_Ver10 ]

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>
#include <ArduinoJson.h>
// for Servo
#include <ESP32Servo.h>
#include <ServoEasing.hpp>
// for OTA
#include <ESPmDNS.h>
#include <NetworkUdp.h>
#include <ArduinoOTA.h>
// SPIFFS
#include "FS.h"
const char ssid[] = "********";
const char pass[] = "********";
const IPAddress ip(192,168,3,17);
const IPAddress gateway(192,168,1,1);  // デフォルトゲートウェイ
const IPAddress subnet(255,255,255,0);
const int pnt_max = 8;
int rel_pins[pnt_max];  // リレーパラメータ用配列
int srv_pins[pnt_max];  // サーボパラメータ用配列
int srv_deg0[pnt_max];  // サーボL側微調整用配列
int srv_deg1[pnt_max];  // サーボR側微調整用配列
int srv_defo[pnt_max];  // サーボデフォ位置用配列
const int srv_min = 1450;
const int srv_max = 2400;
const int srv_deg = 150;
const int srv_sec = 4000;
const uint32_t BUF_SIZE = 255;  // SPIFFS
String file_name = "/config.json";  // ファイル名の指定
String readStr;
AsyncWebServer server(80);      // ポート設定
// Jsonオブジェクトの初期化
StaticJsonDocument<512> doc;
// ブラウザから受信する変数
const char* command;  // コマンド
uint8_t pnt_number;  // ポイント配置番号
uint8_t pnt_status;  // ポイント状態制御(0=L / 1=R)
// for Servo
ServoEasing servo[pnt_max]; // オブジェクト配列定義
void setup() {
  Serial.begin(115200);
  Serial.println("***** SRR Point System Start *****");
  // SPIFFSのセットアップ
  if(!SPIFFS.begin(true)){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }
  WiFi.config(ip, gateway, subnet);
  WiFi.mode(WIFI_STA);  // for OTA
  WiFi.begin (ssid, pass);
  // for OTA
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }
  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH) {
        type = "sketch";
      } else {  // U_SPIFFS
        type = "filesystem";
      }
      // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
      Serial.println("Start updating " + type);
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .onError([](ota_error_t error) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); }
      else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); }
      else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); }
      else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); }
      else if (error == OTA_END_ERROR) { Serial.println("End Failed"); }
    });
  ArduinoOTA.begin();
  // 各種情報を表示
  Serial.print("SSID: ");
  Serial.println(ssid);
  Serial.print("AP IP address: ");
  Serial.println(ip);
  server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");
  server.onNotFound(notFound);
  // Read Config
  Serial.println("Config read.");
  if (SPIFFS.exists(file_name)) {  // ファイルが存在すれば
    File fr = SPIFFS.open(file_name.c_str(), "r");  //データ読み込み
    readStr = fr.readStringUntil('\0');  //EOFまで読み出し
    fr.close();
  } else {
    Serial.println("Error : File not found.");
  }
  StaticJsonDocument<512> docjson;
  DeserializationError error = deserializeJson(docjson, readStr);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }
  else {
    for (JsonObject data_item : docjson["data"].as()) {
      int data_item_pnt_number = data_item["pnt_number"];
      rel_pins[data_item_pnt_number] = data_item["rel_pin"];
      srv_pins[data_item_pnt_number] = data_item["srv_pin"];
      srv_deg0[data_item_pnt_number] = data_item["srv_deg0"];
      srv_deg1[data_item_pnt_number] = data_item["srv_deg1"];
      srv_defo[data_item_pnt_number] = data_item["srv_defo"];
    }
  }
  // for Servo
  Serial.println("Initialize start.");
  for(int i =1; i < pnt_max; i++) {
    pinMode(rel_pins[i], OUTPUT); // pinを出力設定に
    pinMode(srv_pins[i], OUTPUT); // pinを出力設定に
    servo[i].attach(srv_pins[i], srv_min, srv_max); // attach(int pin, int min, int max)
    resetPnt(i);  // ResetPoint
  }
  setEasingTypeForAllServos(EASE_CUBIC_IN_OUT); // EASE_LINEAR is default
  // Pointの制御変数の変更リクエスト
  server.on(
    "/post",
    HTTP_POST,
    [](AsyncWebServerRequest * request){},
    NULL,
    [](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
      String resjson = "";
      for (size_t i = 0; i < len; i++) {
        resjson.concat(char(data[i]));
      }
      Serial.println(resjson);
      DeserializationError error = deserializeJson(doc, resjson);
      if(error){
        Serial.println("deserializeJson() faild");
        request->send(400);
      }
      else{
        command = doc["COMMAND"];
        pnt_number = doc["PNT_NUMBER"];
        pnt_status = doc["PNT_STATUS"];
        // Reset Points
        if (strcmp(command, "reset") == 0) {
          for(int i =1; i < pnt_max; i++) {
            resetPnt(i);
          }
        }
        // Set Point
        if (strcmp(command, "set") == 0) {
          if(pnt_number > 0) {
            if (srv_pins[pnt_number] > 0) servoGo(pnt_number, pnt_status, srv_sec);   // Servo
            if (rel_pins[pnt_number] > 0) relayGo(pnt_number, pnt_status);            // Relay
            command = "";
          }
        }
        request->send(200, "text/plain", "OK"); // Response to xhr
      }
  });
  command = "";
  pnt_number = 0;
  pnt_status = 0;
  // サーバースタート
  Serial.println("Server start.");
  server.begin();
  Serial.println("***** SRR Point System Ready *****");
} // End setup()
void loop() {
  ArduinoOTA.handle();  // for OTA
  delay(100);
} // End loop()
void servoGo(int pnt_number, int pnt_status, int srv_sec) {
  int deg = 0;
  if (pnt_status == 0) { deg = srv_deg0[pnt_number]; }
  else { deg = srv_deg + srv_deg1[pnt_number]; }
  Serial.println(String(pnt_number) + " : deg=" + String(deg));
  servo[pnt_number].setEaseToD(deg, srv_sec);
  synchronizeAllServosStartAndWaitForAllServosToStop();
}
void relayGo(int pnt_number, int pnt_status) {
  if(pnt_status == 0){
    digitalWrite(rel_pins[pnt_number], LOW);
  } else {
    digitalWrite(rel_pins[pnt_number], HIGH);
  }
}
void resetPnt(int pnt_number){
    servoGo(pnt_number, srv_defo[pnt_number], 500);  // initialize
    relayGo(pnt_number, srv_defo[pnt_number]);  // initialize
}
void notFound(AsyncWebServerRequest *request){
  if (request->method() == HTTP_OPTIONS) request->send(200);
  else request->send(404);
}

Json読み込み

  • 投稿日:
  • Category:

後々のメンテナンスを考え、各種設定パラメータをプログラム本体から分離して外部ファイルからスケッチに読み込む形に改造した。JSON形式の外部ファイル(config.json)を作成し、そこへ納める形にしてある。ついでに新規のパラメータ srv_deg0、srv_deg1、srv_defo を追加したが、各々下記(※部)の用途となっている。サーボ定位は、ポイントそれぞれの定位をL側にするかR側にするかの指定用である。これを使い、システム起動時に初期状態として、サーボ及びリレーを定位側に切り替えておくようにした。

[ config.json ]

{ "data":[
  { "pnt_number":1,"rel_pin":26,"srv_pin":16,"srv_deg0":0,"srv_deg1":0,"srv_defo":0 },
  { "pnt_number":2,"rel_pin":27,"srv_pin":17,"srv_deg0":0,"srv_deg1":0,"srv_defo":1 },
  { "pnt_number":3,"rel_pin":32,"srv_pin":18,"srv_deg0":0,"srv_deg1":0,"srv_defo":0 }
]}

※ pnt_number=ポイント番号, rel_pin=リレーピン番号, srv_pin=サーボピン番号, srv_deg0=サーボL側補正, srv_deg1=サーボR側補正, srv_defo=サーボ定位

[ スケッチ:Esp32_AsyncWebServer_OTA2 ]

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <SPIFFS.h>
#include <ArduinoJson.h>
// for Servo
#include <ESP32Servo.h>
#include <ServoEasing.hpp>
// for OTA
#include <ESPmDNS.h>
#include <NetworkUdp.h>
#include <ArduinoOTA.h>
// SPIFFS
#include "FS.h"
const char ssid[] = "********";
const char pass[] = "********";
const IPAddress ip(192,168,3,17);
const IPAddress gateway(192,168,1,1);  // デフォルトゲートウェイ
const IPAddress subnet(255,255,255,0);
const int pnt_max = 8;
int rel_pins[pnt_max];  // リレーパラメータ用配列
int srv_pins[pnt_max];  // サーボパラメータ用配列
int srv_deg0[pnt_max];  // サーボL側微調整用配列
int srv_deg1[pnt_max];  // サーボR側微調整用配列
int srv_defo[pnt_max];  // サーボデフォ位置用配列
const int srv_min = 1450;
const int srv_max = 2400;
const int srv_deg = 150;
const int srv_sec = 4000;
const uint32_t BUF_SIZE = 255;  // SPIFFS
String file_name = "/config.json";  // ファイル名の指定
String readStr;
AsyncWebServer server(80);      // ポート設定
// Jsonオブジェクトの初期化
StaticJsonDocument<512> doc;
// ブラウザから受信する変数
uint8_t pnt_number;  // ポイント配置番号
uint8_t pnt_status;  // ポイント状態制御(0=L / 1=R)
// for Servo
ServoEasing servo[pnt_max]; // オブジェクト配列定義
void setup() {
  Serial.begin(115200);
  Serial.println("***** SRR Point System Start *****");
  // SPIFFSのセットアップ
  if(!SPIFFS.begin(true)){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }
  WiFi.config(ip, gateway, subnet);
  WiFi.mode(WIFI_STA);  // for OTA
  WiFi.begin (ssid, pass);
  // for OTA
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }
  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH) {
        type = "sketch";
      } else {  // U_SPIFFS
        type = "filesystem";
      }
      Serial.println("Start updating " + type);
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .onError([](ota_error_t error) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); }
      else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); }
      else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); }
      else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); }
      else if (error == OTA_END_ERROR) { Serial.println("End Failed"); }
    });
  ArduinoOTA.begin();
  // 各種情報を表示
  Serial.print("SSID: ");
  Serial.println(ssid);
  Serial.print("AP IP address: ");
  Serial.println(ip);
  server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");
  server.onNotFound(notFound);
  // Pointの制御変数の変更リクエスト
  server.on(
    "/post_test",
    HTTP_POST,
    [](AsyncWebServerRequest * request){},
    NULL,
    [](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
      String resjson = "";
      for (size_t i = 0; i < len; i++) {
        //Serial.write(data[i]);
        resjson.concat(char(data[i]));
      }
      Serial.println(resjson);
      DeserializationError error = deserializeJson(doc, resjson);
      if(error){
        Serial.println("deserializeJson() faild");
        request->send(400);
      }
      else{
        pnt_number = doc["PNT_NUMBER"];
        pnt_status = doc["PNT_STATUS"];
        request->send(200);
      }
  });
  pnt_number = 0;
  pnt_status = 0;
  // Read Config
  Serial.println("Config read.");
  if (SPIFFS.exists(file_name)) {  // ファイルが存在すれば
    File fr = SPIFFS.open(file_name.c_str(), "r");  //データ読み込み
    readStr = fr.readStringUntil('\0');  //EOFまで読み出し
    fr.close();
  } else {
    Serial.println("Error : File not found.");
  }
  StaticJsonDocument<512> docjson;
  DeserializationError error = deserializeJson(docjson, readStr);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }
  else {
    for (JsonObject data_item : docjson["data"].as()) {
      int data_item_pnt_number = data_item["pnt_number"];
      rel_pins[data_item_pnt_number] = data_item["rel_pin"];
      srv_pins[data_item_pnt_number] = data_item["srv_pin"];
      srv_deg0[data_item_pnt_number] = data_item["srv_deg0"];
      srv_deg1[data_item_pnt_number] = data_item["srv_deg1"];
      srv_defo[data_item_pnt_number] = data_item["srv_defo"];
    }
  }
  // for Servo
  Serial.println("Initialize start.");
  for(int i =1; i < pnt_max; i++) {
    pinMode(rel_pins[i], OUTPUT); // pinを出力設定に
    pinMode(srv_pins[i], OUTPUT); // pinを出力設定に
    servo[i].attach(srv_pins[i], srv_min, srv_max); // attach(int pin, int min, int max)
    servoGo(i, srv_defo[i], 200);  // initialize
    relayGo(i, srv_defo[i]);  // initialize
  }
  setEasingTypeForAllServos(EASE_CUBIC_IN_OUT); // EASE_LINEAR is default
  // サーバースタート
  Serial.println("Server start.");
  server.begin();
  Serial.println("***** SRR Point System Ready *****");
} // End setup()
void loop() {
  ArduinoOTA.handle();  // for OTA
  if(pnt_number > 0) {
    // Servo
    if (srv_pins[pnt_number] > 0) { servoGo(pnt_number, pnt_status, srv_sec); }
    // Relay
    if (rel_pins[pnt_number] > 0) { relayGo(pnt_number, pnt_status); }
  }
  pnt_number = 0;
  delay(10);
} // End loop()
void servoGo(int pnt_number, int pnt_status, int srv_sec) {
  int deg = 0;
  if (pnt_status == 0) { deg = srv_deg0[pnt_number]; }
  else { deg = srv_deg + srv_deg1[pnt_number]; }
  Serial.println(String(pnt_number) + " : deg=" + String(deg));
  servo[pnt_number].setEaseToD(deg, srv_sec);
  synchronizeAllServosStartAndWaitForAllServosToStop();
}
void relayGo(int pnt_number, int pnt_status) {
  if(pnt_status == 0){
    digitalWrite(rel_pins[pnt_number], LOW);
  } else {
    digitalWrite(rel_pins[pnt_number], HIGH);
  }
}
void notFound(AsyncWebServerRequest *request){
  if (request->method() == HTTP_OPTIONS){
    request->send(200);
  }else{
    request->send(404);
  }
}

OTA化

  • 投稿日:
  • Category:

せっかく Wi-Fi機能のあるデバイス使ってるんだから、プログラム書き込みもコードレスでやりたい。って事で、OTA(Over The Air)書き込みも試してみる。やり方は何種類かあるみたいだが、こちら を参考に一番シンプルな技法を試してみた。ベースにしたのは標準のスケッチサンプルに収録の BasicOTAというやつで、一度これを USB経由で書き込んで ESP32を再起動するとシリアルポートと別にネットワークポートが開くので、次からは USB接続ナシで書き込む事が可能になる(但し、ESP32に給電する別電源が必要)

BasicOTAがうまく行ったので、作り込んで来たここまでのスケッチに OTA環境を足してみる。BasicOTAのスケッチから適宜必要な部分をコピーして移植していった。以下が動作確認のとれた最終スケッチだが、OTA化と同時に想定するポイント(分岐器)を3つに増やし、信号出力PIN番号も一部変えてある。

[ スケッチ:Esp32_AsyncWebServer_OTA ]

#include <WiFi.h>
#include "ESPAsyncWebServer.h"
#include "SPIFFS.h"
#include <ArduinoJson.h>
// for Servo
#include <ESP32Servo.h>
#include <ServoEasing.hpp>
// for OTA
#include <ESPmDNS.h>
#include <NetworkUdp.h>
#include <ArduinoOTA.h>
const char ssid[] = "********";
const char pass[] = "********";
const IPAddress ip(192,168,3,17);
const IPAddress gateway(192,168,1,1);  // デフォルトゲートウェイ
const IPAddress subnet(255,255,255,0);
const int rel_pins[] = {0,26,27,32};
const int srv_pins[] = {0,16,17,18};
const int SIZEOF_REL_PINS = sizeof(rel_pins)/sizeof(rel_pins[0]);
const int srv_min = 1450;
const int srv_max = 2400;
const int srv_deg = 150;
const int srv_sec = 4000;
AsyncWebServer server(80);            // ポート設定
// Jsonオブジェクトの初期化
StaticJsonDocument<512> doc;
// ブラウザから受信する変数
uint8_t pnt_number;  // ポイント配置番号
uint8_t pnt_status;  // ポイント状態制御
// for Servo
ServoEasing servo[SIZEOF_REL_PINS]; // オブジェクト配列定義
void setup()
{
  Serial.begin(115200);
  for(int i =1; i < SIZEOF_REL_PINS; i++) {
    pinMode(rel_pins[i], OUTPUT); // pinを出力設定に
    pinMode(srv_pins[i], OUTPUT); // pinを出力設定に
  }
  // SPIFFSのセットアップ
  if(!SPIFFS.begin(true)){
    Serial.println("An Error has occurred while mounting SPIFFS");
    return;
  }
  WiFi.config(ip, gateway, subnet);
  WiFi.mode(WIFI_STA);  // for OTA
  WiFi.begin (ssid, pass);
  // for OTA
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    delay(5000);
    ESP.restart();
  }
  // for OTA
  ArduinoOTA
    .onStart([]() {
      String type;
      if (ArduinoOTA.getCommand() == U_FLASH) {
        type = "sketch";
      } else {  // U_SPIFFS
        type = "filesystem";
      }
      // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
      Serial.println("Start updating " + type);
    })
    .onEnd([]() {
      Serial.println("\nEnd");
    })
    .onProgress([](unsigned int progress, unsigned int total) {
      Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
    })
    .onError([](ota_error_t error) {
      Serial.printf("Error[%u]: ", error);
      if (error == OTA_AUTH_ERROR) { Serial.println("Auth Failed"); }
      else if (error == OTA_BEGIN_ERROR) { Serial.println("Begin Failed"); }
      else if (error == OTA_CONNECT_ERROR) { Serial.println("Connect Failed"); }
      else if (error == OTA_RECEIVE_ERROR) { Serial.println("Receive Failed"); }
      else if (error == OTA_END_ERROR) { Serial.println("End Failed"); }
    });
  ArduinoOTA.begin();
  // 各種情報を表示
  Serial.print("SSID: ");
  Serial.println(ssid);
  Serial.print("AP IP address: ");
  Serial.println(ip);
  // GETリクエストに対するハンドラーを登録
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/index.html");  // rootにアクセスされた時のレスポンス
  });
  server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SPIFFS, "/style.css", "text/css");  // style.cssにアクセスされた時のレスポンス
  });
  // Pointの制御変数の変更リクエスト
  server.on(
    "/post_test",
    HTTP_POST,
    [](AsyncWebServerRequest * request){},
    NULL,
    [](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) {
      String resjson = "";
      for (size_t i = 0; i < len; i++) {
        //Serial.write(data[i]);
        resjson.concat(char(data[i]));
      }
      Serial.println(resjson);
      DeserializationError error = deserializeJson(doc, resjson);
      if(error){
        Serial.println("deserializeJson() faild");
        request->send(400);
      }
      else{
        pnt_number = doc["PNT_NUMBER"];
        pnt_status = doc["PNT_STATUS"];
        request->send(200);
      }
  });
  pnt_number = 0;
  pnt_status = 0;
  // サーバースタート
  server.begin();
  Serial.println("Server start!");
  // for Servo
  for(int i =1; i < SIZEOF_REL_PINS; i++) {
    servo[i].attach(srv_pins[i], srv_min, srv_max); // attach(int pin, int min, int max)
    servoGo(i, 0);  // initialize
    relayGo(i, 0);  // initialize
  }
  setEasingTypeForAllServos(EASE_CUBIC_IN_OUT); // EASE_LINEAR is default
} // End setup()
void loop() {
  ArduinoOTA.handle();  // for OTA
  if(pnt_number > 0) {
    // Servo
    if (srv_pins[pnt_number] > 0) { servoGo(pnt_number, pnt_status); }
    // Relay
    if (rel_pins[pnt_number] > 0) { relayGo(pnt_number, pnt_status); }
  }
  pnt_number = 0;
  delay(10);
} // End loop()
void servoGo(int pnt_number, int pnt_status) {
  servo[pnt_number].setEaseToD(pnt_status*srv_deg, srv_sec);
  synchronizeAllServosStartAndWaitForAllServosToStop();
}
void relayGo(int pnt_number, int pnt_status) {
  if(pnt_status == 0){
    digitalWrite(rel_pins[pnt_number], LOW);
  } else {
    digitalWrite(rel_pins[pnt_number], HIGH);
  }
}

ポイントマシン試作

  • 投稿日:
  • Category:

ESP32でコントロールしようとしているポイントマシンのメカの方も検討を進めているので、行きがかり上ここで掲載を。求められる性能としては下記があげられる。

  1. シンプルな構造
  2. 位置決めが簡単
  3. 薄型実装可能
  4. 高耐久性
  5. メンテナンス容易

どれも当たり前と言えばその通りなのだが、メカで可動部分が多くなるとどうしたってどこかの箇所で故障が発生しやすくなるので簡易な構造にしたいし、薄型実装に関しては、モジュールベースに 20mm厚のスタイロフォームを使用している関係で出来ればその中に埋め込める高さに抑えたい、という思いがある。メンテナンス性についても、故障や調整時にブロック毎交換出来るような構造にしたいと考え、下写真のようなパーツを試作してみた。

Img_6346.jpg

素材は0.8mm厚のプラ板をシンナーで貼り合わせたもので、今だったら 3Dプリンターで簡単に量産も出来そうだが、残念ながら当社工場にそんな設備は無いので、数が多くなってもなるべく簡単に作れる形状に設計した。

Img_6366.jpg

4本の突起は、PECOポイント部に開いている穴に嵌め込んで固定する為のもの、固定板部に開けた丸穴は、板の裏面に固定したサーボモーターのアームに繋いだピアノ線を通し、テコの支点として機能する。固定板もテスト用として同じ 0.8tだが、量産時にここはもう少し強固なものにし、耐久性を考慮すると穴は何等かの金属で補強した方が良いと考えている。

Img_6365.jpg

ポイント改造結果

  • 投稿日:
  • Category:

さて、PECOポイント改造 の記事で結局最終的にどうしたかというと、案2番目の内容で改造を行なった。実作業として既存の裸線を適宜切断したり、線同士を半田付けした結果、裏面の状況は以下写真の通りとなった(上が改造前)

Img_6300.jpg Img_6313.jpg