未分類」カテゴリーアーカイブ

3Dプリンターでモデルの特定の場所が出なくなった

OpenSCADでモデル作成からstl出力。Repetier-HostV2.2.4というソフトでスライス&プリンタ操作をしている。使用しているプリンターはIUSEというアマゾンで安かった数年前のもの。

The object is not manifold.
This essentially means, that it is not watertight.
This normally causes problems during slicing, resulting in unwanted results.
We strongly advice to repair the model.

気付いたら上のエラーメッセージがRepetier-Hostにガッツリ出ている。しばらく出力していないモデルだけど昔は気づかなかった。

モデルがwatertight(防水?)でないのでうまくいかんかも知らんので修理しろと。watertightでないはモデルの部品が隙間なく並んでいても、重なる部分がないみたいな状態。1cmの立方体から1cmずらして立方体を置いたら隙間なく隣り合ってはいるけどかぶっている部分がないみたいな状態のはず。

なお、OpenSCADでは昔からnot manifoldという旨のメッセージが出ていたけど実際には出力されるから問題なしと放置していた。

いかにも修理ボタンがRepetier-Hostのエラーメッセージの横に出ているのでボタンを押してやると「オブジェクトは多様状態です」といかにも治った雰囲気のメッセージに変わった。

ところが実際に出力するとうまく出力されないと書こうとしたが、出力されたgcodeをRepetier-Hostのgcodeエディタから保存しオンラインシミュレーターで確認するといけそうなのが出力された。

とりあえず印刷中。ちゃんとOpenSCADでmanifoldにしてやってと書こうとしたが、gcode確認してうまく修理ボタンでなおったらそれでしのぐというのもありかもしれない。

結果が出たら追記する。->結果出た下に

manifoldにしてやらないでも動きそうなgcodeで通常通りに出力された。悪いgcodeと比較しようと思ったが何もしないでも動きそうなgcodeが現状出力されている。また、昔のうまくいかなかったときのgcodeは保存していないどころか観点になくチェックもしていない。

現時点では追加で調べられることもないので様子を見る。(調査いったん終了)

ロシェ桃山年末年始の営業時間

年末年始は30まで通常営業。

1/31日は18:00閉店 1/1 休業 1/2-4 は事前電話予約ある時間営業となります

12/27 14:30-23:00
12/28 14:30-23:00
12/29 14:30-23:00 
12/30 10:00-23:00 
12/31 10:00-18:00 
1/1 休業 
1/2 要電話予約(10:00-23:00) 
1/3 要電話予約(10:00-23:00) 
1/4 要電話予約(10:00-23:00)

ロシェ桃山年末年始予定

12/29-1/3は予約が必要です。

12/26 通常営業(18:00-23:00)

12/27 通常営業(14:30-23:00)

12/28 通常営業(14:30-23:00)

12/29 1時間程度前まで予約必要で終日営業(10:00-23:00)

12/30 前日まで予約必要で終日営業(10:00-23:00)

12/31 前日まで予約必要で短縮営業(10:00-19:00)

1/1 前日まで予約必要で短縮営業(13:00-22:00)

1/2 前日まで予約必要で短縮営業(11:00-22:00)

1/3 前日まで予約必要で終日営業(10:00-23:00)

1/4 通常営業再開(14:30-23:00)

連絡先 090-3524-7416  または 075-632-8978

携帯の方がつながりやすいと思います

MHZ19ターミナルタイプのコネクター

MHZ19をはじめとするMHZ14やその他Winsen社製のターミナルタイプですがコネクターがかなり固いです。

また、19はコネクターのメスとセンサー本体の間が折り取れるようになっているのでコネクター部分をしっかり押さえて差し込まないと折れてしまうことがあります。

向きは以下の写真の通りです。

CO2モニター用基板EPEA-CO2-NDIR-04へのプログラム書き込み

はじめに

EPEA-CO2-NDIR-04と書いていますが、マイコンはAtmega328P-PU(内部クロック3.3v/8MHz)なので、一般的なAtmega328Pへの書き込みと同じになります。

マイコンを基盤につけたままだと書き込みが成功しにくいので、基盤からマイコンを外して書き込むことが基本形となります。PC側のArduinoIDEの設定はこちらを参考にしてください

注 基盤にマイコンをつけたまま書き込もうとすると(少なくとも2021/1月時点では)TX,RXの1,2番ピンがMHZの信号と競合してなかなか書き込みに成功しません。

必要部品

書き込み対象マイコン

Atmega328P-PU(内部クロック3.3v/8MHz) 。ブートローダー書き込み済みのもの。壊してしまったら秋月電子等で購入できます。

ブレッドボード

普通のブレッドボード

ジャンパーピン

オスメスで7本

コンデンサ

0.1uF

USB-シリアル変換アダプター

スイッチサイエンスのこれをつかっていますが、機能的にはほかでもいけると思います。

接続方法

ピンの番号はこちらを参照

アダプターのDTRを0.1uFのコンデンサを挟んでマイコンのPIN1に※下記のtwetterリンク参照

アダプターのRX をマイコンのPIN3(TXD)に ※PIN2(RXD)でないので注意

アダプターのTX をマイコンのPIN”(RXD)に

アダプターのVCCをマイコンのPIN7(VCC)に、そこから分岐してさらにPIN20(AVCC)に ※下記のtwetterリンク参照

アダプターのGNDをマイコンのPIN8(GND)に、そこから分岐してさらにPIN22(GND)に ※下記のtwetterリンク参照

アダプターのマイクロUSBを書き込み用のPC(Arduino IDE)に

ライブラリインストール

外部ライブラリとしてMHZ19(CO2センサー用)とFaBoLCDmini_AQM0802A(LCD用)を使っています。IDEのツール、ライブラリを管理からAQM0802A,MHZ19(似た名前がかかるけどMH-Z19のほう)あたりで検索するとでてくると思います。

M5Stack + MHZ19C + WiFi (Local/http)

TODO あとでちゃんと書きなおす(余裕があれば)

飛ばす方 ソース

#include <M5Stack.h>
#include <MHZ19.h>
#include <WiFi.h>
#include <HTTPClient.h>

#define RX 16
#define TX 17
#define INTERVAL 6

const char* ssid     = "XXXXXXX";
const char* password = "XXXXXXX";

MHZ19 myMHZ19;

HardwareSerial  mySerial(1);

void setup(){

  M5.begin();
  M5.Power.begin();
  M5.Lcd.setTextSize(5);
  M5.Lcd.print("start");

  Serial.begin(115200);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    M5.Lcd.print(".");
  }
  M5.Lcd.println("\r\n connected");
  M5.Lcd.print(WiFi. localIP());

  mySerial.begin(9600,SERIAL_8N1,RX,TX);
  delay(100);
  myMHZ19.begin(mySerial);
  myMHZ19.autoCalibration(false);

  delay(2000);
}

int count = 0;
int co2 = 0;
void loop()
{
  if ((count % INTERVAL) == 0 ) {
    co2 = myMHZ19.getCO2();
    displayCo2(co2);
    doPost(co2);
  } else {
     M5.Lcd.print(".");
  }
  count++;
  delay(1000);
}

void displayCo2(int co2) {
  M5.Lcd.clear(); 
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.println("CO2 ppm");
  M5.Lcd.print(co2);
}

void doPost(int co2){
  char json[30];
  sprintf(json, "{\"co2\": \"%d\"}", co2);
  Serial.println(json);
  
  HTTPClient http;
  http.begin("http://192.168.1.3:8081/");
  http.addHeader("Content-Type", "application/json");
  int httpCode = http.POST(json);
  delay(1000);
  Serial.printf("[HTTP] GET... code: %d\n", httpCode);
  http.end();
     
}

受けるほう ソース index.ts (雰囲気)

import express from 'express'
import moment from 'moment'


const app: express.Express = express()
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use(express.static('public'))

app.listen(8081, () => {
  console.log('Running at Port 8081...')
})


app.post('/', (req, res)=> {
  console.log("call")

  // console.log(moment().format())
  console.log(req.body )
  res.send('OK')
})

app.use((req, res) => {
  res.sendStatus(404)
})

URLの指定で末尾の/が抜けているとM5Stackがエラー&リブートを繰り返した。結構はまった。

試験用の配線は前のブログ参照。まだ、試験用でMHZへの電力がたぶんたりてないはず。

MH-Z19CとM5Stack(basic)の接続

(2021.4.27追記)MHZ19というライブラリを使っていますがMHZ19B用に調整された処理が入っているのでCを使う場合は、MHZ19_uartというライブラリの方が良さそうです。

githubにソースあげておきました。(github)

とり急ぎ、MH-Z19CとM5Stackを直結で動かす。機能は表示のみ。電圧は満たしていないのでソフトがプログラムが動く確認までの目的。電源まわりはきちんと作り直さないと数値は大体。(それでも多分うちのかDM306以外の一万円未満のセンサーよりはよいきがする。これで5/1時点でCO2-miniかうちの以外の1万円未満センサーよりは性能良い)

MH-Z19Cは5Vプラマイ0.1Vを要求して守らないと値が不安定になる。「ゆうても大丈夫だろ」と雑にやるとずれます。

配線は、左がM5Stackで右がMH-Z19Cで以下のようにつなぐ。16,17はプログラムで指定しているので変更可能。

  • 5V からVIN
  • G から GND
  • 16 から TX
  • 17 から RX

プログラム。いつもどおりMITライセンスです(ライブラリはLGPL使っているので書き込んだらLGPL)

#include <M5Stack.h>
#include <MHZ19.h>

#define RX 16
#define TX 17
#define INTERVAL 6

MHZ19 myMHZ19;

HardwareSerial  mySerial(1);

void setup(){

  M5.begin();
  M5.Power.begin();
  M5.Lcd.setTextSize(5);
  M5.Lcd.print("start");

  mySerial.begin(9600,SERIAL_8N1,RX,TX);
  delay(100);
  myMHZ19.begin(mySerial);
  myMHZ19.autoCalibration(false);
}

int count = 0;
int co2 = 0;
void loop()
{
  if ((count % INTERVAL) == 0 ) {
    co2 = myMHZ19.getCO2();
  }
  displayCo2(co2, (count % 2));
  count++;
  delay(1000);
}

int count = 0;
int co2 = 0;
void loop()
{
  if ((count % INTERVAL) == 0 ) {
    co2 = myMHZ19.getCO2();
    displayCo2(co2 );
  } else {
     M5.Lcd.print(".");
  }
  count++;
  delay(1000);
}

void displayCo2(int co2) {
  M5.Lcd.clear(); 
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.println("CO2 ppm");
  M5.Lcd.print(co2);
}

EPEA-CO2-NDIR-04 Rev3.0.9のソース

基本、自分用メモ

~1/22 出荷分

#include <FaBoLCDmini_AQM0802A.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <MHZ19.h>

#define SRX 0
#define STX 1
#define INTERVAL 6

MHZ19 myMHZ19;

SoftwareSerial softSerial(SRX, STX);
FaBoLCDmini_AQM0802A lcd;

void setup()
{

  Wire.begin();
  lcd.begin();
  displayLCD("Start");
  delay(1000);
  
  softSerial.begin(9600);
  delay(100);
  myMHZ19.begin(softSerial);
  myMHZ19.autoCalibration(false);
  delay(1000);
}

int count = 0;
int co2 = 0;
void loop()
{
  if ((count % INTERVAL) == 0 ) {
    co2 = myMHZ19.getCO2();
  }
  displayCo2(co2, (count % 2));
  count++;
  delay(1000);
}

void displayLCD(String message) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(message);
}

void displayCo2(int co2, bool isPresiod) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("CO2 ppm");
  lcd.setCursor(0, 1);
  lcd.print(co2);
  if (isPresiod) {
    lcd.print(" .");
  }
}

1/22〜

#include <FaBoLCDmini_AQM0802A.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <MHZ19.h>

#define SRX 0
#define STX 1
#define INTERVAL 6

MHZ19 myMHZ19;

SoftwareSerial softSerial(SRX, STX);
FaBoLCDmini_AQM0802A lcd;

void setup()
{
  checkLED(1000);
  
  Wire.begin();
  lcd.begin();
  displayLCD("Start");
  delay(1000);
  
  checkLED(500);
  
  softSerial.begin(9600);
  delay(100);
  myMHZ19.begin(softSerial);
  myMHZ19.autoCalibration(false);
  delay(1000);
}

void checkLED(int mills) {
  int PIN = 13;
  pinMode(PIN, OUTPUT);
  digitalWrite(PIN, HIGH);
  delay(1000);
  digitalWrite(PIN, LOW);
  delay(mills);
}

int count = 0;
int co2 = 0;
void loop()
{
  if ((count % INTERVAL) == 0 ) {
    co2 = myMHZ19.getCO2();
  }
  displayCo2(co2, (count % 2));
  count++;
  delay(1000);
}

void displayLCD(String message) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(message);
}

void displayCo2(int co2, bool isPresiod) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("CO2 ppm");
  lcd.setCursor(0, 1);
  lcd.print(co2);
  if (isPresiod) {
    lcd.print(" .");
  }
}

2/22~

#include <FaBoLCDmini_AQM0802A.h>
#include <Wire.h>
#include <SoftwareSerial.h>
#include <MHZ19.h>

#define SRX 0
#define STX 1
#define INTERVAL 6

MHZ19 myMHZ19;

SoftwareSerial softSerial(SRX, STX);
FaBoLCDmini_AQM0802A lcd;

void setup()
{
  checkLED(1000);
  
  Wire.begin();
  delay(100);
  lcd.begin();
  delay(100);
  displayLCD("Start");
  delay(1000);
  
  checkLED(500);
  
  softSerial.begin(9600);
  delay(100);
  myMHZ19.begin(softSerial);
  myMHZ19.autoCalibration(false);
  delay(1000);
}

void checkLED(int mills) {
  int PIN = 13;
  pinMode(PIN, OUTPUT);
  digitalWrite(PIN, HIGH);
  delay(1000);
  digitalWrite(PIN, LOW);
  delay(mills);
}

int count = 0;
int co2 = 0;
void loop()
{
  if ((count % INTERVAL) == 0 ) {
    co2 = myMHZ19.getCO2();
  }
  displayCo2(co2, (count % 2));
  count++;
  delay(1000);
}

void displayLCD(String message) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(message);
}

void displayCo2(int co2, bool isPresiod) {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("CO2 ppm");
  lcd.setCursor(0, 1);
  lcd.print(co2);
  if (isPresiod) {
    lcd.print(" .");
  }
}

AWSでPSQLが入っていなかったのでyumインストール

AWSでPSQLが入っていなかったのでyumインストール。

結論としては特にはまるポイントもなく通常通りでいけた。

(青字が入力)

$yum search postgresql
Loaded plugins: priorities, update-motd, upgrade-helper
================================================================= N/S matched: postgresql ==================================================================
(中略)
postgresql92.x86_64 : PostgreSQL client programs
postgresql92-contrib.x86_64 : Extension modules distributed with PostgreSQL
postgresql92-devel.x86_64 : PostgreSQL development header files and libraries
postgresql92-docs.x86_64 : Extra documentation for PostgreSQL
postgresql92-libs.i686 : The shared libraries required for any PostgreSQL clients
postgresql92-libs.x86_64 : The shared libraries required for any PostgreSQL clients
postgresql92-plperl.x86_64 : The Perl procedural language for PostgreSQL
postgresql92-plpython26.x86_64 : The Python2 procedural language for PostgreSQL
postgresql92-plpython27.x86_64 : The Python3 procedural language for PostgreSQL
postgresql92-pltcl.x86_64 : The Tcl procedural language for PostgreSQL
postgresql92-server.x86_64 : The programs needed to create and run a PostgreSQL server
postgresql92-server-compat.x86_64 : PostgreSQL server config files for backward compatibility
postgresql92-test.x86_64 : The test suite distributed with PostgreSQL
postgresql93.x86_64 : PostgreSQL client programs
postgresql93-contrib.x86_64 : Extension modules distributed with PostgreSQL
(中略)

Name and summary matches only, use “search all” for everything.

家の環境の最新クライアント(psql)がpostgresql93.x86_64ぽいので確認

$ yum info postgresql93.x86_64
Loaded plugins: priorities, update-motd, upgrade-helper
Available Packages
Name : postgresql93
Arch : x86_64
Version : 9.3.9
Release : 1.58.amzn1
Size : 4.2 M
Repo : amzn-updates/2015.03
Summary : PostgreSQL client programs
URL : http://www.postgresql.org/
License : PostgreSQL
Description : PostgreSQL is an advanced Object-Relational database management system (DBMS).
: The base postgresql package contains the client programs that you’ll need to
: access a PostgreSQL DBMS server, as well as HTML documentation for the whole
: system. These client programs can be located on the same machine as the
: PostgreSQL server, or on a remote machine that accesses a PostgreSQL server
: over a network connection. The PostgreSQL server can be found in the
: postgresql-server sub-package.

あっていたのでインストール

$ sudo yum install postgresql93.x86_64

(中略)

Complete!

$ psql -h ホスト名 -U ユーザ名 -d DB名

つながった。