我担心未来

你有好的姿势吗?
最近感觉越来越严重了。
我有一种危险的感觉,但在我意识到之前,我已经弯下腰了。我已经想当猫了姿勢が悪いので、自分の姿勢を強制させる装置を作ったら逆に肩が凝りまくった。

中途在公司早会的广播演习中感觉腰部有电击,不得不更加改善姿势姿勢が悪いので、自分の姿勢を強制させる装置を作ったら逆に肩が凝りまくった。

所以,你不能用你手头的东西来做一些可以纠正你姿势的东西吗?我想。
不,不是更正,你不能做一些更正的东西吗?

也就是说,它是一个姿势矫正器姿勢が悪いので、自分の姿勢を強制させる装置を作ったら逆に肩が凝りまくった。

目标

我决定创建一些可以检测姿势状态的东西,并在确定姿势恶化时通知我。
如果你可以的话,便携的所以,我想做一个可以在任何地方使用的东西,在它可以在任何地方使用的前提下,我想找到一种不使用声音或光来通知别人的方法,以免打扰我周围的人!

完成姿势矫正器演示

这是经过反复试验后制造的设备。
可以随身携带我决定将设备连接到帽子上。

结构体

使用附在帽子上的距离传感器获取当前距离。当我设置与 LINE 的距离并启动设备时,伺服电机以当前距离从设置距离移动的量运行,一次性筷子挡住了我的视线。
要清除视野,您需要返回原始位置并接近设定的距离。
当设备的运行时间到来时,LINE会通知你姿势不好时将添加的出点。

看起来很酷!应该!

完成演示

完成后,它会推出姿势不好的点。
出点是通过设定距离的移动率 % 来计算的。
周围的计算源代码请参见

姿勢が悪いので、自分の姿勢を強制させる装置を作ったら逆に肩が凝りまくった。

怎么做

使用的零件

奥尼兹
控制整体物联网开发板是。
这次LINE 机器人我也将它作为服务器端运行以使用 .
预设置等在下面的官方网站上列出。

伺服电机
我用它来挡住我的视线。这就是为什么我用了一个扭矩很大的。

使用的零件:https://akizukidenshi.com/catalog/g/gM-08913/

超声波距离传感器
它用于检测姿势的变化。

使用的零件:https://akizukidenshi.com/catalog/g/gM-11009/

面包板
我用它在帽子的尖端安装了一个距离传感器。

使用的零件:https://akizukidenshi.com/catalog/g/gP-05155/

使用的技术

LINE Bot(LINE 消息传递 API)
用于设置距离和设置运行时间。
最后在这里输出姿势不好的出点。
请参考我之前写的关于如何创建细节的文章。

参考网址:LINE Bot(LINE 消息 API 的文档)

成品装置

姿勢が悪いので、自分の姿勢を強制させる装置を作ったら逆に肩が凝りまくった。姿勢が悪いので、自分の姿勢を強制させる装置を作ったら逆に肩が凝りまくった。

环境

  • Node.js v16.16.0
  • npm v8.11.0
  • obniz v3.23.0
  • line/bot-sdk v7.5.2
  • axios v0.27.2
  • 快递v4.18.1
  • 谷歌电子表格 v2.0.3
  • Visual Studio 代码 v1.71.2

源代码

*****点击这里查看*****
positionCorrent.js
'use strict';
const express = require('express');
const line = require('@line/bot-sdk');

// ローカルポート3000で起動する
const PORT = process.env.PORT || 3000;

// ご自身の環境ごとに設定する必要があります
const config = {
    channelSecret: '***************************',
    channelAccessToken: '******************************************'
};
const client = new line.Client(config);
const Responses = Object.freeze({
    INIT: Symbol(0),
    DISTANCE: Symbol(1),
    TIME: Symbol(2),
    START: Symbol(3),
    END: Symbol(4),
});

let distance;
let setTimeData = 0;
let checkDistance = 0;
let Status = Responses.INIT

// pushメッセージ
const push = async (pushData) => {
    const messages = [{
        type: 'text',
        text: pushData
    }];
    try {
        const res = await client.broadcast(messages);
        console.log(res);
    } catch (error) {
        console.log(`エラー: ${error.statusMessage}`);
        console.log(error.originalError.response.data);
    }
}

// メッセージリプライ処理
async function handleEvent(event) {
    if (event.type !== 'message' || event.message.type !== 'text') {
        return Promise.resolve(null);
    }
    let responsData = "準備中です。";
    
    // 現在の状態事に返答する内容を変更する
    switch (Status) {
        case Responses.DISTANCE:
            if (event.message.text.indexOf("OK") >= 0) {
                Status = Responses.TIME;
                responsData = "時間を設定してください";
                // console.log(event.message.text.indexOf("時間を設定する"))
            }
            else {
                checkDistance = distance;
                responsData = "現在の距離は" + checkDistance + "です。この距離で設定しますか?";
            }
            break;
        case Responses.TIME:
            if (setTimeData != 0 && event.message.text.indexOf("OK") >= 0) {
                TimerCount = 0;
                Status = Responses.START;
                responsData = "姿勢を正しくしてください";
            }
            else {
                setTimeData = Number(event.message.text);
                responsData = "設定距離は" + checkDistance + "mm" + "
";
                responsData += "設定時間は" + setTimeData + "秒です。スタートしますか?";
            }
            break;
        case Responses.START:
            responsData = "落ち着いてください"
            break;
        case Responses.END:
            responsData = "終了しました"
            break;
        default:
            break;
    }
    console.log("responsData: " + responsData);

    // ユーザーにリプライメッセージを送ります。
    return client.replyMessage(event.replyToken, {
        type: 'text', // テキストメッセージ
        text: responsData // ← ここに入れた言葉が実際に返信されます
        // event.message.text には、受信したメッセージが入っているので、それをそのまま返信しています
        // ここを 'テスト' のように書き換えると、何を受信しても「テスト」と返すようになります
    });
}

// ここ以降は理解しなくてOKです
const app = express();
app.get('/', (req, res) => res.send('Hello LINE BOT! (HTTP GET)'));
app.post('/webhook', line.middleware(config), (req, res) => {

    if (req.body.events.length === 0) {
        res.send('Hello LINE BOT! (HTTP POST)');
        console.log('検証イベントを受信しました!');
        return;
    } else {
        console.log('受信しました:', req.body.events);
    }
    Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});

app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);

const Obniz = require('obniz');
// ご自身の環境ごとに設定する必要があります
const obniz = new Obniz('**********'); // Obniz_IDに自分のIDを入れます
let isEndSend = false;
let TimerCount = 0;
let Steps = 0;
let StepLimit = 0;
let OutPoint = 0;

// 距離判定処理
function rageCheck() {
    // 判定閾値を計算
    let firstStepUp = checkDistance * 1.1;
    let firstStepDown = checkDistance * 0.9;
    let secondStepUp = checkDistance * 1.2;
    let secondStepDown = checkDistance * 0.8;
    let thirdStepUp = checkDistance * 1.3;
    let thirdStepDown = checkDistance * 0.7;
    let fourthStepUp = checkDistance * 1.4;
    let fourthStepDown = checkDistance * 0.6;
    let fifthStepUp = checkDistance * 1.5;
    let fifthStepDown = checkDistance * 0.5;
    let sixStepUp = checkDistance * 1.6;
    let sixStepDown = checkDistance * 0.4;
    let sevenStepUp = checkDistance * 1.7;
    let sevenStepDown = checkDistance * 0.3;
    let eightStepUp = checkDistance * 1.8;
    let eightStepDown = checkDistance * 0.2;
    let nineStepUp = checkDistance * 1.9;
    let nineStepDown = checkDistance * 0.1;
    let tenStepUp = checkDistance * 2.0;
    let tenStepDown = checkDistance * 0;
    let endStep = NaN;

    // console.log(
    //     "firstStepUp: " + firstStepUp + "
" +
    //     "firstStepDown: " + firstStepDown + "
" +
    //     "secondStepUp: " + secondStepUp + "
" + 
    //     "secondStepDown: " + secondStepDown + "
" +
    //     "thirdStepUp: " + thirdStepUp + "
" +
    //     "thirdStepDown: " + thirdStepDown + "
" +
    //     "endStep: " + endStep + "
"
    // )

    // 判定処理
    if(firstStepUp >= distance && firstStepDown <=  distance ){
        StepLimit = 0;
    }
    else if(secondStepUp >= distance && secondStepDown <=  distance ){
        StepLimit = 1;
    }
    else if(thirdStepUp >= distance && thirdStepDown <=  distance ){
        StepLimit = 2;
    }
    else if(fourthStepUp >= distance && fourthStepDown <=  distance ){
        StepLimit = 3;
    }
    else if(fifthStepUp >= distance && fifthStepDown <=  distance ){
        StepLimit = 4;
    }
    else if(sixStepUp >= distance && sixStepDown <=  distance ){
        StepLimit = 5;
    }
    else if(sevenStepUp >= distance && sevenStepDown <=  distance ){
        StepLimit = 6;
    }
    else if(eightStepUp >= distance && eightStepDown <=  distance ){
        StepLimit = 7;
    }
    else if(nineStepUp >= distance && nineStepDown <=  distance ){
        StepLimit = 8;
    }
    else if(tenStepUp >= distance && tenStepDown <= distance ){
        StepLimit = 9;
    }
    else {
        StepLimit = 10;
    }
    // 動いたときのポイントを計算する
    if (Steps > StepLimit){
        OutPoint += StepLimit;
    }
    else if (Steps < StepLimit){
        OutPoint += StepLimit;
    }
    else {
        
    }
    Steps = StepLimit;

}

// obnizと接続できたら入る
obniz.onconnect = async () => {
    // 超音波距離センサを利用
    const hcsr04 = obniz.wired('HC-SR04', {
        gnd: 7,
        echo: 6,
        trigger: 5,
        vcc: 4,
    });

    // サーボモータを利用
    const servo = obniz.wired('ServoMotor', { gnd: 0, vcc: 1, signal: 2 });

    // ディスプレイ表示(初期画面)
    obniz.display.clear();
    obniz.display.print('Hello obniz!');
    push("準備ができるまでお待ちください")

    setInterval(async () => {
        TimerCount += 2;
        // 距離を取得
        distance = await hcsr04.measureWait();
        distance = Math.floor(distance);
        // 距離(mm)をターミナルに表示
        console.log(distance + ' mm');
        console.log(TimerCount + '');
        // 状態ごとに動作処理を変更する
        switch (Status) {
            case Responses.INIT:
                if (TimerCount >= 1) {
                    Status = Responses.DISTANCE
                    push("準備が完了しました")
                    servo.angle(10);
                }
            case Responses.DISTANCE:
            case Responses.TIME:
            case Responses.END:
                break;
            case Responses.START:
                // 距離を判定
                rageCheck()
                // サーボモーターを動作
                servo.angle(10 + 16 * Steps);
                console.log("Steps: " + Steps)
                console.log("StepLimit: " + StepLimit)
                // 時間判定
                if (TimerCount >= setTimeData) {
                    Status = Responses.END
                    if (!isEndSend){
                        isEndSend = true;
                        push("終了しました。アウトポイントは" + OutPoint + "ポイントです")
                        servo.angle(10);
                    }
                }
                // push("時間が来るまでそのままの姿勢で仕事を続けてください")
                break;
            default:
                push("準備が完了しました?")
                break;
        }
    }, 2000);

};


使用后的印象

它似乎有效吗?微笑
好像对固定姿势的正确姿势很有用,但由于测量的起点在头顶上方,感觉就像被折磨得连脖子都动不了姿勢が悪いので、自分の姿勢を強制させる装置を作ったら逆に肩が凝りまくった。

就算跑1分钟左右,也会伤到脖子,让肩膀僵硬。

总而言之,还有改进的余地!
此外,姿势变坏的出点只是一个通知,但您可以使用该点进一步改善您的姿势。折磨不,我以为我能动!

暂时用一根一次性筷子遮住我的视野不太舒服,所以我正在考虑在尖端添加各种东西来遮挡我的视野!

直到最后感谢您的阅读!

  • 需要担心的事情

伺服电机转动过猛时,obniz的Wifi有时会断掉……是伺服电机的负载太高还是其他原因……有人知道吗?请告诉我!


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308630191.html

相关文章:

  • 2021-07-03
  • 2021-06-08
  • 2023-03-21
  • 2021-08-15
  • 2021-06-21
猜你喜欢
  • 2021-07-15
  • 2022-01-03
  • 2022-12-23
  • 2021-11-27
  • 2021-11-28
  • 2021-09-08
  • 2022-01-07
相关资源
相似解决方案