diff --git a/3d_imu.adoc b/3d_imu.adoc new file mode 100644 index 0000000..355f721 --- /dev/null +++ b/3d_imu.adoc @@ -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[] + +Ωστόσο παρουσιάζει πρόβλημα στα μαθηματικά και βγάζει ΝαΝ diff --git a/3d_imu.html b/3d_imu.html new file mode 100644 index 0000000..b43bc50 --- /dev/null +++ b/3d_imu.html @@ -0,0 +1,708 @@ + + + + + + + + + + +3D_IMU PROJECT + + + + + + +
+
+
+
+


+
+
+
+
+

1. Χρήση του Arduino

+
+ +
+
+arduino +
+
+
+

Χρειαζόμαστε τις εξής βιβλιοθήκες πρώτα +https://maker.pro/files/MPU6050.zip +https://maker.pro/files/I2Cdev.zip

+
+
+
+
+

2. Κώδικας του Arduino

+
+
+
copy-paste source
+
+
// 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);
+}
+
+
+
+
+
+

3. Σύνδεση με raspberry

+
+
+ + + + + +
+ + +Συνδέουμε με usb το arduino με το raspberry και τρέχουμε το python +
+
+
+
python code
+
+
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

+
+
+
+ +
+
+
+
+
 Διαβάζει τα δεδομένα που δίνει το arduino και τα γράφει σε αρχείο
+προς μοντελοποίηση
+
+
+
+
+
+

4. Μοντελοποίση με το sketch-test3D.js

+
+
+

Στο git Υπάρχει ο κώδικας που μοντελοποιεί τα δεδομένα του dataset

+
+
+
+browser +
+
+
+

Ωστόσο παρουσιάζει πρόβλημα στα μαθηματικά και βγάζει ΝαΝ

+
+
+
+
+ + + \ No newline at end of file