arismileti
5 years ago
2 changed files with 929 additions and 0 deletions
@ -0,0 +1,221 @@ |
|||
= 3D_IMU PROJECT |
|||
Aristeidis Mileti 141285 |
|||
// Metadata: |
|||
:description: Intro and Install |
|||
:keywords: doc, Quick |
|||
:data-uri: |
|||
:toc: right |
|||
:toc-title: Πίνακας περιεχομένων |
|||
:toclevels: 4 |
|||
:source-highlighter: highlight |
|||
:icons: font |
|||
:sectnums: |
|||
|
|||
|
|||
|
|||
{empty} + |
|||
|
|||
|
|||
[[cheat-Ascii]] |
|||
== Χρήση του Arduino |
|||
|
|||
https://git.swarmlab.io:3000/arismileti/3d_IMU.git |
|||
|
|||
image::arduino.webp[] |
|||
|
|||
|
|||
Χρειαζόμαστε τις εξής βιβλιοθήκες πρώτα |
|||
https://maker.pro/files/MPU6050.zip |
|||
https://maker.pro/files/I2Cdev.zip |
|||
|
|||
|
|||
[[cheat-useadoc]] |
|||
|
|||
|
|||
|
|||
== Κώδικας του Arduino |
|||
|
|||
.copy-paste source |
|||
[source,asciidoc] |
|||
---- |
|||
// I2Cdev and MPU6050 must be installed as libraries, or else the .cpp/.h files |
|||
// for both classes must be in the include path of your project |
|||
#include "I2Cdev.h" |
|||
#include "MPU6050.h" |
|||
#include "ArduinoJson.h" |
|||
|
|||
// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation |
|||
// is used in I2Cdev.h |
|||
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE |
|||
#include "Wire.h" |
|||
#endif |
|||
|
|||
// class default I2C address is 0x68 |
|||
// specific I2C addresses may be passed as a parameter here |
|||
// AD0 low = 0x68 (default for InvenSense evaluation board) |
|||
// AD0 high = 0x69 |
|||
MPU6050 accelgyro; |
|||
//MPU6050 accelgyro(0x69); // <-- use for AD0 high |
|||
|
|||
int16_t ax, ay, az; |
|||
int16_t gx, gy, gz; |
|||
|
|||
|
|||
|
|||
// uncomment "OUTPUT_READABLE_ACCELGYRO" if you want to see a tab-separated |
|||
// list of the accel X/Y/Z and then gyro X/Y/Z values in decimal. Easy to read, |
|||
// not so easy to parse, and slow(er) over UART. |
|||
#define OUTPUT_READABLE_ACCELGYRO |
|||
|
|||
// uncomment "OUTPUT_BINARY_ACCELGYRO" to send all 6 axes of data as 16-bit |
|||
// binary, one right after the other. This is very fast (as fast as possible |
|||
// without compression or data loss), and easy to parse, but impossible to read |
|||
// for a human. |
|||
//#define OUTPUT_BINARY_ACCELGYRO |
|||
|
|||
|
|||
#define LED_PIN 13 |
|||
bool blinkState = false; |
|||
|
|||
void setup() { |
|||
// join I2C bus (I2Cdev library doesn't do this automatically) |
|||
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE |
|||
Wire.begin(); |
|||
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE |
|||
Fastwire::setup(400, true); |
|||
#endif |
|||
|
|||
// initialize serial communication |
|||
// (38400 chosen because it works as well at 8MHz as it does at 16MHz, but |
|||
// it's really up to you depending on your project) |
|||
Serial.begin(38400); |
|||
|
|||
// initialize device |
|||
//Serial.println("Initializing I2C devices..."); |
|||
accelgyro.initialize(); |
|||
|
|||
// verify connection |
|||
//Serial.println("Testing device connections..."); |
|||
//Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed"); |
|||
//create JSON Document |
|||
|
|||
// use the code below to change accel/gyro offset values |
|||
/* |
|||
Serial.println("Updating internal sensor offsets..."); |
|||
// -76 -2359 1688 0 0 0 |
|||
Serial.print(accelgyro.getXAccelOffset()); Serial.print("\t"); // -76 |
|||
Serial.print(accelgyro.getYAccelOffset()); Serial.print("\t"); // -2359 |
|||
Serial.print(accelgyro.getZAccelOffset()); Serial.print("\t"); // 1688 |
|||
Serial.print(accelgyro.getXGyroOffset()); Serial.print("\t"); // 0 |
|||
Serial.print(accelgyro.getYGyroOffset()); Serial.print("\t"); // 0 |
|||
Serial.print(accelgyro.getZGyroOffset()); Serial.print("\t"); // 0 |
|||
Serial.print("\n"); |
|||
accelgyro.setXGyroOffset(220); |
|||
accelgyro.setYGyroOffset(76); |
|||
accelgyro.setZGyroOffset(-85); |
|||
Serial.print(accelgyro.getXAccelOffset()); Serial.print("\t"); // -76 |
|||
Serial.print(accelgyro.getYAccelOffset()); Serial.print("\t"); // -2359 |
|||
Serial.print(accelgyro.getZAccelOffset()); Serial.print("\t"); // 1688 |
|||
Serial.print(accelgyro.getXGyroOffset()); Serial.print("\t"); // 0 |
|||
Serial.print(accelgyro.getYGyroOffset()); Serial.print("\t"); // 0 |
|||
Serial.print(accelgyro.getZGyroOffset()); Serial.print("\t"); // 0 |
|||
Serial.print("\n"); |
|||
*/ |
|||
|
|||
// configure Arduino LED for |
|||
pinMode(LED_PIN, OUTPUT); |
|||
} |
|||
|
|||
void loop() { |
|||
// read raw accel/gyro measurements from device |
|||
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); |
|||
|
|||
// these methods (and a few others) are also available |
|||
//accelgyro.getAcceleration(&ax, &ay, &az); |
|||
//accelgyro.getRotation(&gx, &gy, &gz); |
|||
|
|||
#ifdef OUTPUT_READABLE_ACCELGYRO |
|||
// display tab-separated accel/gyro x/y/z values |
|||
// Create a JsonObject |
|||
const size_t capacity = JSON_OBJECT_SIZE(4); |
|||
DynamicJsonBuffer jsonBuffer(capacity); |
|||
//MORFI JSON |
|||
JsonObject& sens = jsonBuffer.createObject(); |
|||
sens["sensor"] = "accelerometer"; |
|||
sens["X"] = ax; |
|||
sens["Y"] = ay; |
|||
sens["Z"] = az; |
|||
//PRINT ACCELEROMETER OBJECT |
|||
delay(100); |
|||
sens.printTo(Serial); |
|||
Serial.print(","); |
|||
sens["sensor"] = "gyroscope"; |
|||
sens["X"] = gx; |
|||
sens["Y"] = gy; |
|||
sens["Z"] = gz; |
|||
delay(100); |
|||
sens.printTo(Serial); |
|||
Serial.print(","); |
|||
Serial.print("\n"); |
|||
|
|||
|
|||
|
|||
#endif |
|||
|
|||
#ifdef OUTPUT_BINARY_ACCELGYRO |
|||
Serial.write((uint8_t)(ax >> 8)); Serial.write((uint8_t)(ax & 0xFF)); |
|||
Serial.write((uint8_t)(ay >> 8)); Serial.write((uint8_t)(ay & 0xFF)); |
|||
Serial.write((uint8_t)(az >> 8)); Serial.write((uint8_t)(az & 0xFF)); |
|||
Serial.write((uint8_t)(gx >> 8)); Serial.write((uint8_t)(gx & 0xFF)); |
|||
Serial.write((uint8_t)(gy >> 8)); Serial.write((uint8_t)(gy & 0xFF)); |
|||
Serial.write((uint8_t)(gz >> 8)); Serial.write((uint8_t)(gz & 0xFF)); |
|||
#endif |
|||
|
|||
// blink LED to indicate activity |
|||
blinkState = !blinkState; |
|||
digitalWrite(LED_PIN, blinkState); |
|||
} |
|||
|
|||
---- |
|||
|
|||
|
|||
== Σύνδεση με raspberry |
|||
|
|||
NOTE: Συνδέουμε με usb το arduino με το raspberry και τρέχουμε το python |
|||
|
|||
.python code |
|||
[source,python] |
|||
---- |
|||
import serial |
|||
|
|||
from time import sleep |
|||
|
|||
ser = serial.Serial('/dev/ttyACM0', 38400) |
|||
sleep(1) |
|||
|
|||
file = open("dataset", "a") |
|||
file.write("[") |
|||
|
|||
for i in range(1000): |
|||
s = ser.readline() |
|||
print(s) |
|||
file.write(str(s)) |
|||
|
|||
file.write("]") |
|||
file.close() |
|||
---- |
|||
|
|||
Embedded Youtube video |
|||
|
|||
video::e79QMBqKm3M[youtube] |
|||
|
|||
Διαβάζει τα δεδομένα που δίνει το arduino και τα γράφει σε αρχείο |
|||
προς μοντελοποίηση |
|||
|
|||
== Μοντελοποίση με το sketch-test3D.js |
|||
|
|||
Στο git Υπάρχει ο κώδικας που μοντελοποιεί τα δεδομένα του dataset |
|||
|
|||
image::browser.png[] |
|||
|
|||
Ωστόσο παρουσιάζει πρόβλημα στα μαθηματικά και βγάζει ΝαΝ |
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue