<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Altium on Antoine Martin's Blog</title><link>https://martantoine.github.io/tags/altium/</link><description>Recent content in Altium on Antoine Martin's Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 14 Jun 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://martantoine.github.io/tags/altium/index.xml" rel="self" type="application/rss+xml"/><item><title>DuploBuster</title><link>https://martantoine.github.io/posts/duplobuster/</link><pubDate>Wed, 14 Jun 2023 00:00:00 +0000</pubDate><guid>https://martantoine.github.io/posts/duplobuster/</guid><description>&lt;h2 id="competition-specifications"&gt;Competition Specifications&lt;/h2&gt;
&lt;p&gt;The goal of this competition is to create an autonomous robot able to gather Duplo toys and drop them in the collection zone of the 8x8 meters arena that features obstacles and different terrains.
The room have four different regions with different color LEDs in every corner. The robot have 10 minutes inside the room to collect as many Duplo as it can.&lt;/p&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/duplobuster/Arena.png"
alt=""
loading="lazy"
style="max-width: 700px; height: auto;"&gt;
&lt;/div&gt;
&lt;h2 id="how-the-robot-collects-duplo"&gt;How the robot collects Duplo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A claw grips the toy and elevates it into it&amp;rsquo;s compartment&lt;/li&gt;
&lt;li&gt;Once the Duplo has picked up enough toys it releases them at the dropping zone by opening it&amp;rsquo;s door&lt;/li&gt;
&lt;li&gt;The front camera uses machine learning to recognize Duplos while a LIDAR scans the environment for obstacles&lt;/li&gt;
&lt;li&gt;A 360° top camera gives the position and angle while an A* algorithm deduces it&amp;rsquo;s trajectory&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="object-detection"&gt;Object Detection&lt;/h2&gt;
&lt;h3 id="problem-introduction"&gt;Problem Introduction&lt;/h3&gt;
&lt;p&gt;The duplo are localized using deep learning. In fact the Duplo comes in big variety of colors and shapes, making feature detection algorithm impractical in this situation.&lt;/p&gt;
&lt;h3 id="dataset"&gt;Dataset&lt;/h3&gt;
&lt;p&gt;Pictures of Duplo in the arena were captured using the same camera (Raspberry Pi Camera V2.1) that would then eventually be used for the inference.&lt;/p&gt;
&lt;p&gt;A total of &lt;strong&gt;600&lt;/strong&gt; pictures were capture, after deleting the non usable one, &lt;strong&gt;523&lt;/strong&gt; remained.&lt;/p&gt;
&lt;p&gt;The dataset was labelled on the free to use online platform &lt;em&gt;Roboflow&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="policy-training"&gt;Policy Training&lt;/h3&gt;
&lt;p&gt;The framework used for target identification is &lt;strong&gt;YoloV6&lt;/strong&gt; (&lt;strong&gt;YOLOv6-N&lt;/strong&gt; to be exact), it is the lightest and fastest to run model among all others (works with \textbf{640x640} pixels pictures). The policy was trained on &lt;em&gt;Google Colab&lt;/em&gt; and exported to the &lt;em&gt;ONNX&lt;/em&gt; format for inference.&lt;/p&gt;
&lt;h3 id="results"&gt;Results&lt;/h3&gt;
&lt;p&gt;The raw inference performance are the following:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;True positive&lt;/th&gt;
&lt;th&gt;False positive&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;83%&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/duplobuster/input.jpg"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/duplobuster/output.png"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="electronics"&gt;Electronics&lt;/h2&gt;
&lt;h3 id="sensor-list"&gt;Sensor list&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Ultrasonic Distance Sensor HCS04 x 2&lt;/li&gt;
&lt;li&gt;Microswitch Sensor x 4&lt;/li&gt;
&lt;li&gt;MPU-9150&lt;/li&gt;
&lt;li&gt;RPLIDAR A1M8&lt;/li&gt;
&lt;li&gt;Raspberry Pi Camera V2.1&lt;/li&gt;
&lt;li&gt;Webcam Logitech C720&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="actuator-list"&gt;Actuator list&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Maxon EC 32 flat (15 W), 1:60 gearbox&lt;/li&gt;
&lt;li&gt;DC motor x 2&lt;/li&gt;
&lt;li&gt;Stepper motor&lt;/li&gt;
&lt;li&gt;Buzzer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most of those sensors and actuators are interfaced through &lt;strong&gt;I2C&lt;/strong&gt;, &lt;strong&gt;SPI&lt;/strong&gt;, &lt;strong&gt;PWM&lt;/strong&gt; and &lt;strong&gt;Serial&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A STM32F4 is used for interfacing with the sensors and actuators in realtime.&lt;/p&gt;
&lt;p&gt;A Raspberry Pi 4 Model B is used for more resource intensive task (e.g. computer vision).&lt;/p&gt;
&lt;h3 id="connections-diagram"&gt;Connections diagram&lt;/h3&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/duplobuster/electronic.png"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;h3 id="electronic-assembly"&gt;Electronic assembly&lt;/h3&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/duplobuster/result_elec.png"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Maxon 24/2 controller&lt;/li&gt;
&lt;li&gt;DC Driver 15x2 Lite&lt;/li&gt;
&lt;li&gt;Raspberry Pi Camera V2.1&lt;/li&gt;
&lt;li&gt;Raspberry Pi 4 Model B&lt;/li&gt;
&lt;li&gt;Nucleo F446&lt;/li&gt;
&lt;li&gt;Breadboard + IMU + AMIS-30543&lt;/li&gt;
&lt;li&gt;Power Board&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="custom-pcb"&gt;Custom PCB&lt;/h3&gt;
&lt;p&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/duplobuster/aci_pcb.jpeg"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
connects sensors and actuators with the MCU and Raspberry Pi.&lt;/p&gt;
&lt;h2 id="some-hardware-details"&gt;Some hardware details&lt;/h2&gt;
&lt;h3 id="lidar"&gt;LIDAR&lt;/h3&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/duplobuster/LIDAR.jpg"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;h3 id="the-claw-grasps-the-duplo"&gt;The claw (grasps the Duplo)&lt;/h3&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/duplobuster/claws.jpeg"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;h3 id="driving-wheels"&gt;Driving wheels&lt;/h3&gt;
&lt;p&gt;The front wheels are 3D printed using TPU
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/duplobuster/front_wheel.png"
alt=""
loading="lazy"
style="max-width: 700px; height: auto;"&gt;
&lt;/div&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/duplobuster/coupler.jpeg"
alt=""
loading="lazy"
style="max-width: 700px; height: auto;"&gt;
&lt;/div&gt;
&lt;/p&gt;</description></item><item><title>Sensor Acquisition System</title><link>https://martantoine.github.io/posts/sas/</link><pubDate>Sat, 11 Sep 2021 00:00:00 +0000</pubDate><guid>https://martantoine.github.io/posts/sas/</guid><description>&lt;h2 id="introduction"&gt;Introduction&lt;/h2&gt;
&lt;h3 id="requirements"&gt;Requirements:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Support up to 16 sensors simultaneous&lt;/li&gt;
&lt;li&gt;Support different kind of sensors, must be easily upgradable to support new ones&lt;/li&gt;
&lt;li&gt;Independent conditioning of the signal for each sensor (1 board per sensor)&lt;/li&gt;
&lt;li&gt;Transmit the data to the computer which will log it&lt;/li&gt;
&lt;li&gt;Settings must be set from the computer&lt;/li&gt;
&lt;li&gt;Sampling rate of 1kHz&lt;/li&gt;
&lt;li&gt;Resolution of 16bits&lt;/li&gt;
&lt;li&gt;Required supported sensors:
&lt;ul&gt;
&lt;li&gt;force sensor using Wheastone bridge&lt;/li&gt;
&lt;li&gt;Thermocouple&lt;/li&gt;
&lt;li&gt;Pressure sensor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="project-architecture"&gt;Project Architecture&lt;/h2&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/sas/architecture.PNG"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;h2 id="components"&gt;Components&lt;/h2&gt;
&lt;p&gt;The list of components used has changed quite a lot thorough the design, I will for the sake of clarity only talk about the final design choice.&lt;/p&gt;
&lt;h3 id="analog-to-digital-converter"&gt;Analog to Digital Converter&lt;/h3&gt;
&lt;p&gt;Accordingly to the requirements, the ADC must have 16 physical pins to which the sensors would be always connected.
Moreover it has to sample each 16 sensors at a resolution of 16 bits at 1kHz.&lt;/p&gt;
&lt;h3 id="mcu"&gt;MCU&lt;/h3&gt;
&lt;p&gt;The MCU must validates the following requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 SPI interface of at least 256 kbits/s (one for the ADC, the other for the USB port)&lt;/li&gt;
&lt;li&gt;be of the STM32 family (since it&amp;rsquo;s the one mostly used at the ERT)&lt;/li&gt;
&lt;li&gt;handle a SPI data traffic of 256 kbits/s from the ADC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In order to reduce the workload on the PCB design, the MCU must be already assembled on a board featuring :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;USB interface for transmitting data/debugging/programming of the MCU&lt;/li&gt;
&lt;li&gt;Header pins such that it can plugged as a shield on the main PCB board&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The chosen MCU is the Nucleo STM32 F446RE.&lt;/p&gt;
&lt;h3 id="power-supply"&gt;Power Supply&lt;/h3&gt;
&lt;p&gt;Many voltages are needed : 5V, 3.3V, 9V, 12V.&lt;/p&gt;
&lt;h2 id="hostboard-a"&gt;Hostboard A&lt;/h2&gt;
&lt;p&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/sas/Hostboard_A_schema.PNG"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/sas/Hostboard_A_pcb3D_1.PNG"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/sas/Hostboard_A_pcb3D_2.PNG"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
PCBs assembly
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/sas/hostboard_raw.JPG"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
Assembled PCBs with test pcb
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/sas/hostboard_assembled.JPG"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="daugtherboard"&gt;Daugtherboard&lt;/h2&gt;
&lt;p&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/sas/Daughterboard_schema.PNG"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/sas/Daughterboard_pcb3D_1.PNG"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/sas/Daughterboard_pcb3D_2.PNG"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="pcbs-assembly"&gt;PCBs assembly&lt;/h2&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/sas/PCBs_assembly.PNG"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;</description></item><item><title>Rocket Avionics - EPFL Rocket Team</title><link>https://martantoine.github.io/posts/io_rocket_avionic/</link><pubDate>Sat, 22 Feb 2020 00:00:00 +0000</pubDate><guid>https://martantoine.github.io/posts/io_rocket_avionic/</guid><description>&lt;h2 id="project-description"&gt;Project Description&lt;/h2&gt;
&lt;p&gt;The IO Rocket was a ~ 1.8 meters rocket made by members of the [https://epflrocketteam.ch/our-projects/io/](EPFL Rocket Team - ERT).&lt;/p&gt;
&lt;p&gt;It wasn&amp;rsquo;t designed for competition purposed but rather to let us learn new skills as many of us building the rocket were in their first or second year of bachelor.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve personnaly worked under the avionic sub-system, more precisely I was tasked to build to PCBs responsible for telemetry and triggering the second explosive charge (to deploy the second chute).&lt;/p&gt;
&lt;p&gt;It was for me the opportunity to learn the software Altium Designer, a schematic and PCB design software&lt;/p&gt;
&lt;p&gt;Due to the COVID-19 pandemic, the IO project was ended sooner than expected and we never had the opportunity to rebuild a second enhanced version.&lt;/p&gt;
&lt;p&gt;In fact, the only IO rocket we&amp;rsquo;ve launched was really rough, see below ;)
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;video controls style="max-width: 100%;"&gt;
&lt;source src="https://martantoine.github.io/posts/io_rocket_avionic/20200222_170717.mp4" type="video/mp4"&gt;
&lt;/video&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="some-insights-of-the-avionic"&gt;Some insights of the avionic&lt;/h2&gt;
&lt;p&gt;Components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IMU : attitude&lt;/li&gt;
&lt;li&gt;BMP180 : pressure, altitude, temperature&lt;/li&gt;
&lt;li&gt;Arduino nano : MCU&lt;/li&gt;
&lt;li&gt;Lora : Radio&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="render_avionic_pcb.png"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/io_rocket_avionic/cover.png"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;h2 id="memories"&gt;Memories..&lt;/h2&gt;
&lt;p&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/io_rocket_avionic/20200222_164829.jpg"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;div style="text-align: center; margin: 1.5rem 0;"&gt;
&lt;img src="https://martantoine.github.io/posts/io_rocket_avionic/group.jpg"
alt=""
loading="lazy"
style="max-width: 100%; height: auto;"&gt;
&lt;/div&gt;
&lt;/p&gt;</description></item></channel></rss>