我担心未来
你有好的姿势吗?
最近感觉越来越严重了。
我有一种危险的感觉,但在我意识到之前,我已经弯下腰了。我已经想当猫了
中途在公司早会的广播演习中感觉腰部有电击,不得不更加改善姿势
所以,你不能用你手头的东西来做一些可以纠正你姿势的东西吗?我想。
不,不是更正,你不能做一些更正的东西吗?
也就是说,它是一个姿势矫正器
目标
我决定创建一些可以检测姿势状态的东西,并在确定姿势恶化时通知我。
如果你可以的话,便携的所以,我想做一个可以在任何地方使用的东西,在它可以在任何地方使用的前提下,我想找到一种不使用声音或光来通知别人的方法,以免打扰我周围的人!
完成姿势矫正器演示
这是经过反复试验后制造的设备。
可以随身携带我决定将设备连接到帽子上。
结构体
使用附在帽子上的距离传感器获取当前距离。当我设置与 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