{ "cells": [ { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "backend = widget\n" ] } ], "source": [ "import time\n", "\n", "#%matplotlib notebook\n", "%matplotlib widget\n", "\n", "\n", "import matplotlib.pyplot as plt\n", "print(\"backend = \",plt.get_backend()) #prints \"widget\"\n", "\n", "from matplotlib.animation import FuncAnimation\n", "from datetime import datetime\n", "import matplotlib.dates as mdates\n", "from collections import deque\n", "import numpy as np\n", "import os\n", "import serial\n", "import socket\n", "import re\n", "\n", "PORT = \"COM43\"\n", "PORT = \"/dev/ttytDAN\"\n", "#PORT = \"/tmp/ttyJupyter\"\n", "\n", "# How many sensor samples we want to store\n", "HISTORY_SIZE = 2500\n", "\n", "# Pause re-sampling the sensor and drawing for INTERVAL seconds\n", "INTERVAL = 0.01\n", "\n" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sample time: 2026-04-28 13:48:11\n", "Opened /dev/ttytDAN\n", "[0.0, 0.0, 8192.0, 0.0, 0.0, 0.0, -176.0, 312.0, 424.0]\n", "[0.0, 0.0, 8192.0, 0.0, 0.0, 0.0, -180.0, 298.0, 441.0]\n", "[0.0, 0.0, 8192.0, 0.0, 0.0, 0.0, -175.0, 299.0, 437.0]\n", "[0.0, 0.0, 8192.0, 0.0, 0.0, 0.0, -180.0, 304.0, 458.0]\n", "[0.0, 0.0, 8192.0, 0.0, 0.0, 0.0, -182.0, 300.0, 427.0]\n" ] } ], "source": [ "now = datetime.now()\n", "serialport = None\n", "\n", "def get_imu_data():\n", " global serialport\n", " if not serialport:\n", " # open serial port\n", " serialport = serial.Serial(PORT, 115200, timeout=0.1)\n", " # check which port was really used\n", " print(\"Opened\", serialport.name)\n", " # Flush input\n", " time.sleep(3)\n", " serialport.readline()\n", "\n", " # Poll the serial port\n", " line = str(serialport.readline(), 'utf-8')\n", " if not line:\n", " return None\n", " #print(line)\n", " #if not \"Uni:\" in line:\n", " # return None\n", " if not \"Raw:\" in line:\n", " return None\n", " #vals = line.replace(\"Uni:\", \"\").strip().split(',')\n", " vals = line.replace(\"Raw:\", \"\").strip().split(',')\n", " #print(vals)\n", " if len(vals) != 9:\n", " return None\n", " try:\n", " vals = [float(i) for i in vals]\n", " except ValueError:\n", " return None\n", " #print(vals)\n", " return vals\n", "# demonstrate capture works with a sample of 20 lines\n", "print(\"Sample time: \",now.strftime(\"%Y-%m-%d %H:%M:%S\"))\n", "for _ in range(5):\n", " print(get_imu_data())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Magnetometer data capture" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "After closing port and before starting.\n", "HOSTNAME: eos , PORT: /dev/ttytDAN\n", "Plotting time start: 2026-04-28 13:48:19\n", "Before show()\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "18d570ab556e4834892b65fe6d786a64", "version_major": 2, "version_minor": 0 }, "image/png": "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xbXXXls8//zzxWuvvVZs3bq16OrqKvHkpXWi+/Sd73ynqK6uLr7zne8Ur732WvHss88WU6ZMKZYtW1biyUtn8+bNxZ133lk89dRTRUQUTz/99Dsev2fPnuKcc84pWltbi5deeqn4xje+UVRWVhZbtmwpzcCUnABkVHPmzCmWLl06/OfBwcFi6tSpRXt7+6jHf/azny2uu+66EWuNjY3F3/7t357SOcvtRPfpDx05cqQ499xzi29/+9unasTTwsns05EjR4orr7yy+Na3vlUsXrw4RQCe6D5985vfLC644IJiYGCgVCOeFk50n5YuXVr85V/+5Yi11tbW4qqrrjqlc54ujicAv/SlLxUf/ehHR6wtWLCgaGlpOYWTUU7eAuYoAwMDsX379mhubh5eq6ioiObm5ujs7Bz1nM7OzhHHR0S0tLQc8/ix4GT26Q+9+eab8dZbb43pX8Z+svv0la98JSZNmhQ33nhjKcYsu5PZp+9///vR1NQUS5cujfr6+rjkkkti1apVMTg4WKqxS+5k9unKK6+M7du3D79NvGfPnti8eXNce+21JZn5TJDxGp6d3wTCUQ4cOBCDg4PDv0nkbfX19bF79+5Rz+nu7h71+O7u7lM2Z7mdzD79odtvvz2mTp161IV3LDmZfXr++efj0Ucfja6urhJMeHo4mX3as2dP/Md//Ed87nOfi82bN8err74aX/ziF+Ott96Ktra2UoxdciezTzfccEMcOHAgPvGJT0RRFHHkyJG45ZZb4o477ijFyGeEY13D+/r64re//W2cffbZZZqMU8UdQCiT1atXx4YNG+Lpp5+Ompqaco9z2jh06FAsXLgw1q9fHxMnTiz3OKe1oaGhmDRpUjzyyCMxa9asWLBgQdx5552xbt26co92Wtm6dWusWrUqHn744dixY0c89dRTsWnTprj33nvLPRqUjTuAHGXixIlRWVkZPT09I9Z7enpi8uTJo54zefLkEzp+LDiZfXrb/fffH6tXr44f/vCHcdlll53KMcvuRPfp5z//ebz++usxb9684bWhoaGIiBg/fny8/PLLceGFF57aocvgZL6epkyZEmeddVZUVlYOr334wx+O7u7uGBgYiKqqqlM6czmczD7dfffdsXDhwvj85z8fERGXXnppHD58OG6++ea48847R/yu9KyOdQ2vra1192+M8lXPUaqqqmLWrFnR0dExvDY0NBQdHR3R1NQ06jlNTU0jjo+IeO655455/FhwMvsUEXHffffFvffeG1u2bInZs2eXYtSyOtF9uvjii+PFF1+Mrq6u4cenPvWpuOaaa6KrqysaGhpKOX7JnMzX01VXXRWvvvrqcCBHRLzyyisxZcqUMRl/ESe3T2+++eZRkfd2NBdFceqGPYNkvIanV+6fQuH0tGHDhqK6urp4/PHHi5deeqm4+eabi/POO6/o7u4uiqIoFi5cWCxfvnz4+J/85CfF+PHji/vvv7/YtWtX0dbWluZjYE5kn1avXl1UVVUVTz75ZPGrX/1q+HHo0KFyvYSSONF9+kNZfgr4RPdp7969xbnnnlv83d/9XfHyyy8XP/jBD4pJkyYVX/3qV8v1EkriRPepra2tOPfcc4t//dd/Lfbs2VP8+7//e3HhhRcWn/3sZ8v1Ek65Q4cOFTt37ix27txZRETx4IMPFjt37ix+8YtfFEVRFMuXLy8WLlw4fPzbHwPzj//4j8WuXbuKtWvX+hiYMU4Ackzf+MY3ivPPP7+oqqoq5syZU/znf/7n8D+7+uqri8WLF484/rvf/W5x0UUXFVVVVcVHP/rRYtOmTSWeuDxOZJ8+8IEPFBFx1KOtra30g5fYiX49/f+yBGBRnPg+vfDCC0VjY2NRXV1dXHDBBcXXvva14siRIyWeuvROZJ/eeuut4stf/nJx4YUXFjU1NUVDQ0PxxS9+sfjf//3f0g9eIj/60Y9Gvda8vS+LFy8urr766qPOmTlzZlFVVVVccMEFxT//8z+XfG5KZ1xRuP8NAJCJ7wEEAEhGAAIAJCMAAQCSEYAAAMkIQACAZAQgAEAyAhAAIBkBCACQjAAEAEhGAAIAJCMAAQCSEYAAAMkIQACAZAQgAEAyAhAAIBkBCACQjAAEAEhGAAIAJCMAAQCSEYAAAMkIQACAZAQgAEAyAhAAIBkBCACQjAAEAEhGAAIAJCMAAQCSEYAAAMkIQACAZAQgAEAyAhAAIJn/B94+2opdFJXOAAAAAElFTkSuQmCC", "text/html": [ "\n", "