<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Finished Projects on Lizerd</title><link>https://www.lizerd.se/projects/finished/</link><description>Recent content in Finished Projects on Lizerd</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 23 Apr 2014 00:00:00 +0000</lastBuildDate><atom:link href="https://www.lizerd.se/projects/finished/index.xml" rel="self" type="application/rss+xml"/><item><title>Proto Modules</title><link>https://www.lizerd.se/projects/finished/proto-modules/</link><pubDate>Wed, 23 Apr 2014 00:00:00 +0000</pubDate><guid>https://www.lizerd.se/projects/finished/proto-modules/</guid><description>&lt;img src="https://www.lizerd.se/" alt="Featured image of post Proto Modules" /&gt;&lt;p&gt;There is not always a good solution to design your PCB without testing some of the more important parts or implementations ideas that haven&amp;rsquo;t been tested before, to see if it is working as you thought. So from the beginning I have been using experimental PCB boards that I could use to test my solutions. But long ago I switch over to SMD parts and scraped the trough hole components that I had. And then the experimental boards became quite hard to use. So I started creating different small PCB boards that holds my standard parts and solutions.
I have quite a lot of them now, so I thought I could show a few.
I use plastic plate as base that has a grid of holes drill in it, so I can mount the boards and use Dupont cables to connect between each module.
&lt;a class="link" href="Fixture-Medium.jpg" &gt;&lt;img alt="Fixture (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/proto-modules/Fixture-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/proto-modules/Fixture-Medium_hu_232aea9b197d6c23.jpg 800w, https://www.lizerd.se/projects/finished/proto-modules/Fixture-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="Fixture3Medium.jpg" &gt;&lt;img alt="Fixture3(Medium)" class="gallery-image" data-flex-basis="401px" data-flex-grow="167" height="718" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/proto-modules/Fixture3Medium.jpg" srcset="https://www.lizerd.se/projects/finished/proto-modules/Fixture3Medium_hu_17314fc01b04c4b8.jpg 800w, https://www.lizerd.se/projects/finished/proto-modules/Fixture3Medium.jpg 1200w" width="1200"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="mcu-boards"&gt;&lt;a href="#mcu-boards" class="header-anchor"&gt;&lt;/a&gt;MCU Boards
&lt;/h3&gt;&lt;p&gt;Since many year back now I use STM32 MCU family as my standard processor. I made my own break out boards for the different MCU family&amp;rsquo;s.
&lt;a class="link" href="MCUboardsMedium.jpg" &gt;&lt;img alt="MCUboards(Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/proto-modules/MCUboardsMedium.jpg" srcset="https://www.lizerd.se/projects/finished/proto-modules/MCUboardsMedium_hu_ed7ec7d6f4323184.jpg 800w, https://www.lizerd.se/projects/finished/proto-modules/MCUboardsMedium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="MCU-board2Medium.jpg" &gt;&lt;img alt="MCU board2(Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/proto-modules/MCU-board2Medium.jpg" srcset="https://www.lizerd.se/projects/finished/proto-modules/MCU-board2Medium_hu_fc9109968ede8c8f.jpg 800w, https://www.lizerd.se/projects/finished/proto-modules/MCU-board2Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="tft-28-inch-with-touch--touch-controller-on-the-board"&gt;&lt;a href="#tft-28-inch-with-touch--touch-controller-on-the-board" class="header-anchor"&gt;&lt;/a&gt;TFT 2.8 inch with touch + touch controller on the board
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="20140423_081947-Medium.jpg" &gt;&lt;img alt="20140423_081947 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/proto-modules/20140423_081947-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/proto-modules/20140423_081947-Medium_hu_d5e83ee5c470dfe9.jpg 800w, https://www.lizerd.se/projects/finished/proto-modules/20140423_081947-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="3-half-h-bridge-channel-power-board-used-as-an-example-to-drive-bldc-motors"&gt;&lt;a href="#3-half-h-bridge-channel-power-board-used-as-an-example-to-drive-bldc-motors" class="header-anchor"&gt;&lt;/a&gt;3 (half H bridge)  channel power board, used as an example to drive BLDC motors
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="20140423_082108-Medium.jpg" &gt;&lt;img alt="20140423_082108 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/proto-modules/20140423_082108-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/proto-modules/20140423_082108-Medium_hu_16dbbb752b9f263f.jpg 800w, https://www.lizerd.se/projects/finished/proto-modules/20140423_082108-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="24bit-adc-with-a-precision-voltage-reference"&gt;&lt;a href="#24bit-adc-with-a-precision-voltage-reference" class="header-anchor"&gt;&lt;/a&gt;24bit ADC with a precision voltage reference
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="24bit-ADC-with-good-Vref-Medium.jpg" &gt;&lt;img alt="24bit ADC with good Vref (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/proto-modules/24bit-ADC-with-good-Vref-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/proto-modules/24bit-ADC-with-good-Vref-Medium_hu_56e41011512c5ce2.jpg 800w, https://www.lizerd.se/projects/finished/proto-modules/24bit-ADC-with-good-Vref-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="i-have-made-a-lot-of-small-modules-here-is-a-few-bluetooth-2ch-stepper-motor-driver-various"&gt;&lt;a href="#i-have-made-a-lot-of-small-modules-here-is-a-few-bluetooth-2ch-stepper-motor-driver-various" class="header-anchor"&gt;&lt;/a&gt;I have made a lot of small modules, here is a few. (Bluetooth, 2ch stepper motor driver, various)
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="20140423_082659-Medium.jpg" &gt;&lt;img alt="20140423_082659 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/proto-modules/20140423_082659-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/proto-modules/20140423_082659-Medium_hu_c53fbad970073ef1.jpg 800w, https://www.lizerd.se/projects/finished/proto-modules/20140423_082659-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
For debugging I use my own USB to serial (3.3/5v) modules. And if the solution depends on various timings, then I place a dedicated connector with a few IO connections to the MCU. So when I debug internal race condition I can always use a logic analyzer to see what is happening.
&lt;a class="link" href="UARTMedium.jpg" &gt;&lt;img alt="UART(Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/proto-modules/UARTMedium.jpg" srcset="https://www.lizerd.se/projects/finished/proto-modules/UARTMedium_hu_518d7e2c66a1f97e.jpg 800w, https://www.lizerd.se/projects/finished/proto-modules/UARTMedium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
I have also made some larger boards like my DDS module.
I put various function on the board that enables me to test a few DDS signal generator ideas I had.
&lt;a class="link" href="dds1.jpg" &gt;&lt;img alt="dds1" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/proto-modules/dds1.jpg" srcset="https://www.lizerd.se/projects/finished/proto-modules/dds1_hu_2b2b279492707edb.jpg 800w, https://www.lizerd.se/projects/finished/proto-modules/dds1.jpg 1024w" width="1024"&gt;&lt;/a&gt;
I have many other test modules that I will add to the list later on.&lt;/p&gt;</description></item><item><title>Temp controller (8ch PID)</title><link>https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/</link><pubDate>Mon, 21 Apr 2014 00:00:00 +0000</pubDate><guid>https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/</guid><description>&lt;img src="https://www.lizerd.se/" alt="Featured image of post Temp controller (8ch PID)" /&gt;&lt;p&gt;By request I made a board that holds 8 channel temp controller. In this solution the sensors had be digital for high accuracy in a noisy environment, but there are also analog inputs that enables the module to be used as a generic 8ch PID controller.&lt;/p&gt;
&lt;h1 id="structure"&gt;&lt;a href="#structure" class="header-anchor"&gt;&lt;/a&gt;Structure
&lt;/h1&gt;&lt;p&gt;&lt;a class="link" href="Structure.jpg" &gt;&lt;img alt="Structure" class="gallery-image" data-flex-basis="317px" data-flex-grow="132" height="636" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/Structure.jpg" srcset="https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/Structure_hu_dfbf505cff0273dc.jpg 800w, https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/Structure.jpg 841w" width="841"&gt;&lt;/a&gt;
Each channel can select input source, ether digital SPI or analog input (12bit resolution). Each channel has it&amp;rsquo;s own PID and control settings.
The controller can be configured to work in many different ways.
The unit is powered by a 5 to 24v and can send status and settings trough an RS232 port.&lt;/p&gt;
&lt;h1 id="temp-sensor"&gt;&lt;a href="#temp-sensor" class="header-anchor"&gt;&lt;/a&gt;Temp Sensor
&lt;/h1&gt;&lt;p&gt;I used a small 5-pin SOT23 temp IC, LM95071 SPI/MICROWIRE 14-Bit Temperature Sensor. This gives me resolution of 0.03125°C between −40°C to +150°C.&lt;/p&gt;
&lt;h1 id="board"&gt;&lt;a href="#board" class="header-anchor"&gt;&lt;/a&gt;Board
&lt;/h1&gt;&lt;p&gt;&lt;a class="link" href="tempcontroller.jpg" &gt;&lt;img alt="tempcontroller" class="gallery-image" data-flex-basis="401px" data-flex-grow="167" height="718" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/tempcontroller.jpg" srcset="https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/tempcontroller_hu_10fbdd15962a4978.jpg 800w, https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/tempcontroller.jpg 1200w" width="1200"&gt;&lt;/a&gt;
&lt;a class="link" href="PCB_Description.jpg" &gt;&lt;img alt="PCB_Description" class="gallery-image" data-flex-basis="508px" data-flex-grow="211" height="564" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/PCB_Description.jpg" srcset="https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/PCB_Description_hu_c25e741744fa5ae9.jpg 800w, https://www.lizerd.se/projects/finished/temp-controller-8ch-pid/PCB_Description.jpg 1194w" width="1194"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="demo-video-sorry-there-is-only-a-swedish-version"&gt;&lt;a href="#demo-video-sorry-there-is-only-a-swedish-version" class="header-anchor"&gt;&lt;/a&gt;Demo Video (sorry, there is only a Swedish version)
&lt;/h1&gt;&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/afwvBYhhC7Y" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;h1 id="settings"&gt;&lt;a href="#settings" class="header-anchor"&gt;&lt;/a&gt;Settings
&lt;/h1&gt;&lt;p&gt;UART = 115200
RAW data to controller must start with $ and end with #                !!!&lt;/p&gt;
&lt;h3 id="standard-functions"&gt;&lt;a href="#standard-functions" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;Standard Functions&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;INF   $INF#          &lt;em&gt;Show info data&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;CLR   $CLR#         &lt;em&gt;Clear (Resets) Settings, &amp;ldquo;Do not effect eeprom settings&amp;rdquo;&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;SAV   $BRN#        &lt;em&gt;Save settings data to EEprom (Burn current data into Eeprom)&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;UPD   $UPD#       &lt;em&gt;Update settings data from eeprom&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;SWV $SFW#        Show FW version&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="tempsensor-port---temp-channel-select-function"&gt;&lt;a href="#tempsensor-port---temp-channel-select-function" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;TempSensor port -&amp;gt; Temp Channel Select function&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Select which TempSensor ( SPI port ) that selected TempChannel(PID regulator channel) should get it’s temperature from.&lt;/strong&gt;
&lt;strong&gt;TCS   $TCS@1*3#       &lt;em&gt;Temp Channel Set, TempChannel 1 is set to use TempSensor on port 3&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="enabledisable-functions"&gt;&lt;a href="#enabledisable-functions" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;Enable/Disable functions&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;TCE   $TCE*1#     &lt;em&gt;Temp controller Enable/Disable   0=Disable, 1=Enable (on enabled PID (I) is reset to Zero). All channels will be Enabled/Disabled. Only channels that is Enabled&lt;/em&gt; “CHE” &lt;em&gt;will be activated on&lt;/em&gt; $TCE*1#&lt;/strong&gt;
&lt;strong&gt;CHE   $CHE*1#     &lt;em&gt;Channel 1 Temp Control Enable      (CH 1-&amp;gt;8)
on enabled PID (I) is reset to Zero.&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;CHD   $CHD*1#     &lt;em&gt;Channel 1 Temp Control Disable    (CH 1-&amp;gt;8)
on enabled PID (I) is reset to Zero.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="main-setup-functions"&gt;&lt;a href="#main-setup-functions" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;Main Setup functions&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;NOC   $NOC*2#     &lt;em&gt;Number of active channels “in order” that should be used “0 to 8 -&amp;gt; CH0 to CH8”&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;TUR   $TUR*20#    &lt;em&gt;Temp and PID Update Rate in Hz, example = 20Hz&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;DUD   $DUD*2#     &lt;em&gt;Debug Update Divide, &amp;ldquo;Temp Update Rate&amp;rdquo;/DUD , in example 20Hz/2 =&lt;/em&gt; &lt;em&gt;10Hz.  The debug data will be updated (sent) 10 times/sec&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;SUR   $SUR*1#     &lt;em&gt;SPI update Rate &amp;quot; SPI communications Freq&amp;quot;&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;0 = 140KHz
1 = 280KHz
2 = 500KHz
3 = 1MHz
4 = 2.25MHz
5 = 4.5MHz&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SDS   $SDS*2#     &lt;em&gt;Set Debug Status,                     example = debug is set to output channel 2 data&lt;/em&gt;&lt;/strong&gt;
&lt;em&gt;&lt;strong&gt;Debug_Status = 0;      No debug
Debug_Status = 1;      Channel 1 data
Debug_Status = 2;      Channel 2 data
Debug_Status = 3;      Channel 3 data
Debug_Status = 4;      Channel 4 data
Debug_Status = 5;      Channel 5 data
Debug_Status = 6;      Channel 6 data
Debug_Status = 7;      Channel 7 data
Debug_Status = 8;      Channel 8 data
Debug_Status = 9;      Send only every channels temp in visual form  {Value in (int)(float * 10)}
Debug_Status = 10;    Send only every channels temp in visual form  {Value in float}
Debug_Status = 11;    Send only temp from all channels in graph data&lt;/strong&gt;&lt;/em&gt;
&lt;em&gt;&lt;strong&gt;Debug 1 to 8 data format&lt;/strong&gt;&lt;/em&gt; &lt;strong&gt;&lt;em&gt;(&lt;em&gt;&lt;strong&gt;Temperature * 10&lt;/strong&gt;:&lt;/em&gt;&lt;/em&gt; Temp_Ref * 10&lt;/strong&gt;:** Temp_Error * 10**:** PID_Resualt / 10**:** P_Resualt / 10 &lt;strong&gt;:&lt;/strong&gt; I_Resualt &lt;strong&gt;:&lt;/strong&gt; D_Resualt &lt;strong&gt;:&lt;/strong&gt; PWM**) all values are in Short HEX and separated by “:”, new data is separated with 0x0A = &amp;ldquo;/n&amp;rdquo;.**
&lt;strong&gt;Channel Temp Settings&lt;/strong&gt;
&lt;strong&gt;SRT   $SRT@1*51.6#    &lt;em&gt;Set Reference Temperature, example set CH1 ref temp to 51.6 deg&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="pid-settings"&gt;&lt;a href="#pid-settings" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;PID Settings&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;SPK   $SPK@1*101.1#   &lt;em&gt;Set Pid K value for selected channel, example K = 101.1 on Channel 1&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;SPP   $SPP@1*1.1#   &lt;em&gt;Set Pid P value for selected channel, example P = 1.1 on Channel 1&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;SPI   $SPI@1*0.1#   &lt;em&gt;Set Pid I value for selected channel, example I = 0.1 on Channel 1&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;SPD   $SPD@3*10.5#   &lt;em&gt;Set Pid D value for selected channel, example I = 10.5 on Channel 3&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="channel-power-settings"&gt;&lt;a href="#channel-power-settings" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;Channel Power Settings&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;SMP   $SMP@1*100#   &lt;em&gt;Set Max Power &amp;ldquo;PWM Max Duty&amp;rdquo; 0-100%   example, CH1 set to 100% as max power level&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;SLP   $SMP@1*0#     &lt;em&gt;Set Min Power &amp;ldquo;PWM Min Duty&amp;rdquo; 0-100%   example, CH1 set to 0% as max power level&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="power-invert-function--for-example-active-cooling-equipment"&gt;&lt;a href="#power-invert-function--for-example-active-cooling-equipment" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;Power Invert function,&lt;/strong&gt;   &lt;strong&gt;For example active cooling equipment&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;CIE&lt;/strong&gt;  &lt;strong&gt;$CIE*1#       Enable Power Inverted function on Channel 1 (0% power inverts to 100% power)
CID&lt;/strong&gt;  &lt;strong&gt;$CID*1#      Disable Power Inverted function on Channel 1&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="example-channel1-settings"&gt;&lt;a href="#example-channel1-settings" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;Example Channel1 Settings&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;// &lt;em&gt;Set Reference Temp&lt;/em&gt;
SRT@1*55.5
//// &lt;em&gt;Set CH 1 K value&lt;/em&gt;
SPK@1*1
//// &lt;em&gt;Set CH 1 P value&lt;/em&gt;
SPP@1*400.5
//// &lt;em&gt;Set CH 1 I value&lt;/em&gt;
SPI@1*0.5
//// &lt;em&gt;Set CH 1 D value&lt;/em&gt;
SPD@1*100.5
//// &lt;em&gt;Set CH 1 Set Max Power&lt;/em&gt;
SMP@1*50
//// &lt;em&gt;Set CH 1 Set Min Power&lt;/em&gt;
SLP@1*0
//// &lt;em&gt;Set TempChannel1 to SensorPort 1&lt;/em&gt;
TCS@1*1&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="example-main-settings"&gt;&lt;a href="#example-main-settings" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;Example Main Settings&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;// &lt;em&gt;Temp/PID Update Rate in Hz&lt;/em&gt;
TUR*4
//// &lt;em&gt;SPI update Rate , 0 = 140KHz&lt;/em&gt;
SUR*0
////  &lt;em&gt;Set Debug Status = No Debug&lt;/em&gt;
SDS*0
//// &lt;em&gt;Debug Update Divide&lt;/em&gt;
DUD*2
//// &lt;em&gt;Number of Channels that is active&lt;/em&gt;
NOC*2&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Modular Data Acquisition System</title><link>https://www.lizerd.se/projects/finished/modular-data-acquisition-system/</link><pubDate>Sun, 20 Apr 2014 00:00:00 +0000</pubDate><guid>https://www.lizerd.se/projects/finished/modular-data-acquisition-system/</guid><description>&lt;img src="https://www.lizerd.se/" alt="Featured image of post Modular Data Acquisition System" /&gt;&lt;p&gt;I made a system for signal data acquisition that had to be modular and also work standalone without a connected PC. It should be powered by battery or usb and communication should be done by Bluetooth or USB. The memory had to be absurdly large or else I had to implement a trigger and sample profile that should be able to handle various situations. The later was the better solution. I did the PCB HW and firmware plus demo PC software that held all the functions/classes needed for another guy that did the final PC software, mechanic parts and HW installation.
So this is what I did.&lt;/p&gt;
&lt;h2 id="hw-part"&gt;&lt;a href="#hw-part" class="header-anchor"&gt;&lt;/a&gt;HW Part
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="Base-Medium.jpg" &gt;&lt;img alt="Base (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/Base-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/Base-Medium_hu_b89e3677e272915.jpg 800w, https://www.lizerd.se/projects/finished/modular-data-acquisition-system/Base-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
The system is based on a hub module (in the plastic case), a sensor module (aluminum case) and a sensor package (lower left corner).
Multiple sensor modules can be connected to the hub trough daisy chain.
&lt;a class="link" href="sensor_board.jpg" &gt;&lt;img alt="sensor_board" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/sensor_board.jpg" srcset="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/sensor_board_hu_dbede16bd11315ad.jpg 800w, https://www.lizerd.se/projects/finished/modular-data-acquisition-system/sensor_board.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="sensor_board_back.jpg" &gt;&lt;img alt="sensor_board_back" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/sensor_board_back.jpg" srcset="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/sensor_board_back_hu_4a6e56c0482f1d65.jpg 800w, https://www.lizerd.se/projects/finished/modular-data-acquisition-system/sensor_board_back.jpg 1024w" width="1024"&gt;&lt;/a&gt;
The sensor module holds two differential input channels that are used for strain gauge measurement (Instrumentation Amplifiers), and six analog (12bit) or digital inputs. Each differential channel has a settable offset trough the 12bit DAC, so the offset can be adjusted while the profile is running. The module also holds one 3 axis accelerometer and one The RGB led is for status indication. The board on the picture is not fully populated. I used &amp;ldquo;no delay SPI flash memory&amp;rdquo; that enables me to sample and save data at a high rate. I made four flash memory footprints so it can be populated with 4 to 16MBit storage memory.  I use two SPI channels so I can write/read to two memories at the same time. The module also holds a regulator for the 10v that is used for the strain gauge sensors. This voltage can also be recorded if the user wants to check supply variations.
&lt;a class="link" href="20131029_115618-Medium.jpg" &gt;&lt;img alt="20131029_115618 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/20131029_115618-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/20131029_115618-Medium_hu_4e9f186c1e32abe1.jpg 800w, https://www.lizerd.se/projects/finished/modular-data-acquisition-system/20131029_115618-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
The module is divided into two sections, analog and digital. This is to reduce noise.
&lt;a class="link" href="hub_board.jpg" &gt;&lt;img alt="hub_board" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/hub_board.jpg" srcset="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/hub_board_hu_69b8c1ad4676ad0e.jpg 800w, https://www.lizerd.se/projects/finished/modular-data-acquisition-system/hub_board.jpg 1024w" width="1024"&gt;&lt;/a&gt;
The hub holds the USB and Bluetooth (v3.0) connection to the PC. It is using a step-up converter to step 5v (battery or USB) up to 12v for the strain gauge supply.
The empty footprint below the Bluetooth is for another Bluetooth module type, but the one from ST electronics was better suited for speed reasons. This module
also holds a global trigger input that is used in this application for absolute positioning of the cylindrical assembly it is mounted on.
Both Hub and Sensor module has power saving functionality to reduce power consumption when the system runs on battery .&lt;/p&gt;
&lt;h2 id="sw-part"&gt;&lt;a href="#sw-part" class="header-anchor"&gt;&lt;/a&gt;SW Part
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="PC.jpg" &gt;&lt;img alt="PC" class="gallery-image" data-flex-basis="336px" data-flex-grow="140" height="783" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/PC.jpg" srcset="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/PC_hu_de8c98427d87370b.jpg 800w, https://www.lizerd.se/projects/finished/modular-data-acquisition-system/PC.jpg 1099w" width="1099"&gt;&lt;/a&gt;
This is the demo software that I did for the other programmer and for my own debugging purpose.
The main structure of a data acquisition profile is that each sensor module has it&amp;rsquo;s own profile of how it will run -  independent of the other modules on the system.
Each Sensor module has n number of Sessions, each Session holds x number of cycles, each cycle holds period samples.
Lets say the module monitors two pressure sensitive cables that are placed on a road (almost everyone has seen this some time on some road).
A session holds the period settings. For each session trigger we get a cycle that contains data for each car. In that cycle we get a number of periods. Each period holds data for each wheel pair that are sensed by the cables.
If we have specified that we only want to record 100 cars that meet the first Session profile, we can set cycle length to 100, and the create a second Session for another profile settings that detects trucks instead.&lt;/p&gt;
&lt;h3 id="session-settings"&gt;&lt;a href="#session-settings" class="header-anchor"&gt;&lt;/a&gt;Session Settings
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="SessionSettings.jpg" &gt;&lt;img alt="SessionSettings" class="gallery-image" data-flex-basis="208px" data-flex-grow="87" height="394" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/SessionSettings.jpg" width="343"&gt;&lt;/a&gt;
Each module can hold multiple different Sessions, and each can be used multiple times or until the memory is full.
For each Session we can adjust the Differential channel offset (Vref). This is used for an increased range on ether the positive or negative signal side. If Vref is set to zero mV we have 12bit ADC resolution on the positive side of the strain gauge.  or if Vref is set to (max signal)/2, we have 11bit ADC resolution on both side of the strain gauge. And the same thing if you like better resolution on the negative side only.
The rest of the settings have the same functionality as in Period.&lt;/p&gt;
&lt;h3 id="period-settings"&gt;&lt;a href="#period-settings" class="header-anchor"&gt;&lt;/a&gt;Period Settings
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="Trigger.png" &gt;&lt;img alt="Trigger" class="gallery-image" data-flex-basis="499px" data-flex-grow="208" height="148" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/Trigger.png" width="308"&gt;&lt;/a&gt;
&lt;strong&gt;Start Trigger&lt;/strong&gt;sets on what signal or property you like the period to start on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;External Signal&lt;/strong&gt; is coupled directly to the global trigger (a trigger signal that is sent to all sensor modules).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ADC&lt;/strong&gt; is used when you like to trigger on an analog signal from a selected channel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time&lt;/strong&gt; is what it sounds like -  time from the last Period ended or Session started.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Percentage&lt;/strong&gt; can be used when you have a repetitive global trigger signal. The module calculates the time between triggers and you can set a percentage so the trigger time can vary and you still get the same point between trigger signals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct&lt;/strong&gt; means that the Period starts directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Number of samples&lt;/strong&gt; can be used if you like to wait n numbers of ADC samples before Period should start recording signal data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="link" href="Flank.png" &gt;&lt;img alt="Flank" class="gallery-image" data-flex-basis="779px" data-flex-grow="324" height="93" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/Flank.png" width="302"&gt;&lt;/a&gt;
&lt;strong&gt;Start Flank&lt;/strong&gt; sets whether the trigger should activate on positive, negative or any flank.
&lt;a class="link" href="Filter-Time.png" &gt;&lt;img alt="Filter Time" class="gallery-image" data-flex-basis="1291px" data-flex-grow="537" height="58" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/Filter-Time.png" width="312"&gt;&lt;/a&gt;
&lt;strong&gt;Start Filter Time&lt;/strong&gt; sets how long the trigger flank has to be steady before it is valid. The module starts recording data at the trigger moment, but if the filter shows that the trigger signal is not valid after n time it will delete recorded data and wait until next trigger. The value is X * 0.1mS, so a value of 100 equals 10mS.
.
&lt;a class="link" href="TriggerChannel.png" &gt;&lt;img alt="TriggerChannel" class="gallery-image" data-flex-basis="303px" data-flex-grow="126" height="249" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/TriggerChannel.png" width="315"&gt;&lt;/a&gt;
&lt;strong&gt;Start ADC channel&lt;/strong&gt; is where you set the channel that should be used if the Start Trigger is set to ADC.
.
&lt;a class="link" href="nTriggerBefore.png" &gt;&lt;img alt="nTriggerBefore" class="gallery-image" data-flex-basis="1248px" data-flex-grow="520" height="64" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/nTriggerBefore.png" width="333"&gt;&lt;/a&gt;
&lt;strong&gt;Number of Triggers Before Start&lt;/strong&gt; can be set if you know that there is n number of signal triggers before the data that should be recorded.
.
&lt;a class="link" href="ADC-TriggerValue1.png" &gt;&lt;img alt="ADC TriggerValue" class="gallery-image" data-flex-basis="1312px" data-flex-grow="546" height="60" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/ADC-TriggerValue1.png" width="328"&gt;&lt;/a&gt;
&lt;strong&gt;Start Value&lt;/strong&gt; holds the value the ADC should trigger on in mV.
.
&lt;a class="link" href="EndSamething.png" &gt;&lt;img alt="EndSamething" class="gallery-image" data-flex-basis="618px" data-flex-grow="257" height="132" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/EndSamething.png" width="340"&gt;&lt;/a&gt;
&lt;strong&gt;And there is the same settings for the end trigger&lt;/strong&gt;. So you can set start trigger to an analog signal and set end trigger to time or number of samples as an example.
&lt;a class="link" href="FreqSettings.jpg" &gt;&lt;img alt="FreqSettings" class="gallery-image" data-flex-basis="593px" data-flex-grow="247" height="291" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/FreqSettings.jpg" width="720"&gt;&lt;/a&gt;
For each period we can set different ADC settings based on what we want so sample. The Sensor module has three ADC units, each 12-Bit resolution. Total sampling speed (ADC1 + ADC2 + ADC3) while storing data to flash is about 60KHz. It&amp;rsquo;s mostly dependent on number of channels per ADC, flash write time and filter settings. In this window the user can set average (Filter) and wanted sampling frequency. Not every sampling speed can be met however, so the closest frequency is displayed (Selected Freq). The lowest sampling frequency is 40Hz / Average. In the window ADC3 has a sample frequency of one sample per second, but it takes 10000 samples and makes an average of those over one second.
&lt;a class="link" href="Freq.png" &gt;&lt;img alt="Freq" class="gallery-image" data-flex-basis="298px" data-flex-grow="124" height="274" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/Freq.png" width="341"&gt;&lt;/a&gt;
The ADC settings are then saved in the period profile. Each ADC can hold multiple channels.
&lt;a class="link" href="Channels.png" &gt;&lt;img alt="Channels" class="gallery-image" data-flex-basis="259px" data-flex-grow="108" height="309" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/Channels.png" width="334"&gt;&lt;/a&gt;
If  ADC1 is set to 1KHz it does not matter if you select one or two channels, the sampling frequency is still 1Khz&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ADC1_CH1        DIFF_CH1_SIGNAL_PIN.    &amp;lt;- Strain gage&lt;/li&gt;
&lt;li&gt;ADC1_CH2       DIFF_CH2_SIGNAL_PIN.&lt;/li&gt;
&lt;li&gt;ADC2_CH1       DIFF_VOLTAGE_PIN.&lt;/li&gt;
&lt;li&gt;ADC2_CH2      ACC_Z_SIGNAL_PIN.     &amp;lt;- Internal Accelerometer&lt;/li&gt;
&lt;li&gt;ADC2_CH3      ACC_X_SIGNAL_PIN.&lt;/li&gt;
&lt;li&gt;ADC2_CH4      ACC_Y_SIGNAL_PIN.&lt;/li&gt;
&lt;li&gt;ADC3_CH1       AIN_CH1_PIN.       &amp;lt;- Analog inputs&lt;/li&gt;
&lt;li&gt;ADC3_CH2      AIN_CH2_PIN.&lt;/li&gt;
&lt;li&gt;ADC3_CH3      AIN_CH3_PIN.&lt;/li&gt;
&lt;li&gt;ADC3_CH4      AIN_CH4_PIN.&lt;/li&gt;
&lt;li&gt;ADC3_CH5      AIN_CH5_PIN.&lt;/li&gt;
&lt;li&gt;ADC3_CH6      AIN_CH6_PIN.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Profile setup.&lt;/strong&gt;
&lt;a class="link" href="ModuleMenu.png" &gt;&lt;img alt="ModuleMenu" class="gallery-image" data-flex-basis="221px" data-flex-grow="92" height="369" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/ModuleMenu.png" width="340"&gt;&lt;/a&gt;
To setup the Profile, the tree view holds the settings. Here we can get current status, Download profile to selected module, upload sample data, add and remove content.
&lt;a class="link" href="SessionMenu.png" &gt;&lt;img alt="SessionMenu" class="gallery-image" data-flex-basis="319px" data-flex-grow="133" height="223" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/SessionMenu.png" width="297"&gt;&lt;/a&gt;
For each Session.
&lt;a class="link" href="PeriodMenu.png" &gt;&lt;img alt="PeriodMenu" class="gallery-image" data-flex-basis="356px" data-flex-grow="148" height="245" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/PeriodMenu.png" width="364"&gt;&lt;/a&gt;
For each Period.
&lt;a class="link" href="Commands.png" &gt;&lt;img alt="Commands" class="gallery-image" data-flex-basis="284px" data-flex-grow="118" height="239" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/Commands.png" width="283"&gt;&lt;/a&gt;
Main control to run each or all modules. Using Send trigger the user can manually trig each module and upload sample data.
&lt;a class="link" href="PreSampling.jpg" &gt;&lt;img alt="PreSampling" class="gallery-image" data-flex-basis="367px" data-flex-grow="153" height="783" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/PreSampling.jpg" srcset="https://www.lizerd.se/projects/finished/modular-data-acquisition-system/PreSampling_hu_99dc8af7c10a7cda.jpg 800w, https://www.lizerd.se/projects/finished/modular-data-acquisition-system/PreSampling.jpg 1200w" width="1200"&gt;&lt;/a&gt;
After the module has sampled the data it can be viewed and exported.
This project was fun to create. I had to think a lot about timings and squeeze as much functionality in the MCU as possible without loosing sampling speed.&lt;/p&gt;</description></item><item><title>Irrigation System</title><link>https://www.lizerd.se/projects/finished/irrigation-system/</link><pubDate>Sun, 13 Apr 2014 00:00:00 +0000</pubDate><guid>https://www.lizerd.se/projects/finished/irrigation-system/</guid><description>&lt;img src="https://www.lizerd.se/" alt="Featured image of post Irrigation System" /&gt;&lt;p&gt;By request for an irrigation system based on &amp;ldquo;Ebb and Flood irrigation technique&amp;rdquo; I made a system that should be able to handle a very large area and variation in complexity as well as irrigation types. The system is modular and is based on a main unit and multiple modules that are used for sensors and system control. My idea was to make the system stand alone so there should be no need for a computer running the garden/greenhouse, but I still wanted a good and easy way to configure and log the system. So with that in mind I built a system that is stand alone, but configured with a PC program trough radio/USB.
This is what I came up with:&lt;/p&gt;
&lt;h2 id="pc-software"&gt;&lt;a href="#pc-software" class="header-anchor"&gt;&lt;/a&gt;PC software
&lt;/h2&gt;&lt;h2 id="p1"&gt;&lt;a href="#p1" class="header-anchor"&gt;&lt;/a&gt;&lt;a class="link" href="P1.jpg" &gt;P1&lt;/a&gt;
&lt;/h2&gt;&lt;p&gt;I though about how to make it easy to see the setup ether if it&amp;rsquo;s a small garden or a large greenhouse. So I made an aerial view solution. You can add as many &amp;ldquo;views&amp;rdquo; as you like and they will show up as tabs (blue arrow). With each view you can add a picture that should show your garden/greenhouse layout or parts of it by using multiple views. Then you can freely draw smaller boxes on the picture that indicate specific areas. Each box can be the area the sprinkler is affecting if you use sprinklers. Or it can be a flower bed area that use water drop irrigation. And so on. One module can control one area but it can also share sensor information or status with other modules/areas.
&lt;a class="link" href="P6.jpg" &gt;&lt;img alt="P6" class="gallery-image" data-flex-basis="313px" data-flex-grow="130" height="647" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/P6.jpg" srcset="https://www.lizerd.se/projects/finished/irrigation-system/P6_hu_5b562327ba97c702.jpg 800w, https://www.lizerd.se/projects/finished/irrigation-system/P6.jpg 845w" width="845"&gt;&lt;/a&gt;
Blue is views and red is areas within that view.
&lt;a class="link" href="P3.jpg" &gt;&lt;img alt="P3" class="gallery-image" data-flex-basis="309px" data-flex-grow="128" height="373" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/P3.jpg" width="481"&gt;&lt;/a&gt;
Each area can connect to sensors or signals from the whole system.
Only sensors that can be used (in this case Rain sensors) will show in the drop down selection box.
&lt;a class="link" href="P4.jpg" &gt;&lt;img alt="P4" class="gallery-image" data-flex-basis="402px" data-flex-grow="167" height="252" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/P4.jpg" width="423"&gt;&lt;/a&gt;
Each area can control up to four activators, either on it&amp;rsquo;s own area or others. For example one main water solenoids that supplies all areas can be set in each area output, so when the area sprinkler solenoid is turned on the main water solenoid only supplies water when it is needed.
&lt;a class="link" href="Setting1.jpg" &gt;&lt;img alt="Setting1" class="gallery-image" data-flex-basis="120px" data-flex-grow="50" height="434" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/Setting1.jpg" width="218"&gt;&lt;/a&gt; &lt;a class="link" href="Setting2.jpg" &gt;&lt;img alt="Setting2" class="gallery-image" data-flex-basis="123px" data-flex-grow="51" height="343" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/Setting2.jpg" width="177"&gt;&lt;/a&gt; &lt;a class="link" href="Setting3.jpg" &gt;&lt;img alt="Setting3" class="gallery-image" data-flex-basis="112px" data-flex-grow="47" height="417" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/Setting3.jpg" width="196"&gt;&lt;/a&gt;
&lt;strong&gt;Area Status&lt;/strong&gt; holds current status from the area (Sampled from the selected sensors).
&lt;strong&gt;Get Modules&lt;/strong&gt; is where I select a specific module that holds a wanted sensor. Only modules that have the selected sensor will show in the list.
&lt;strong&gt;Set Modules&lt;/strong&gt; is where I select activators that should be enabled if the selected area output is active.
&lt;strong&gt;Time frame Settings&lt;/strong&gt; is where you can set start and end time for each day or for a specific day when the profile should be active.
&lt;strong&gt;Last Enable&lt;/strong&gt; is exactly what it says - the last time the area activators were enabled.
&lt;strong&gt;Timer Settings&lt;/strong&gt; is where you can set a &amp;ldquo;dumb&amp;rdquo; timer.
&lt;a class="link" href="Setting4.jpg" &gt;&lt;img alt="Setting4" class="gallery-image" data-flex-basis="189px" data-flex-grow="79" height="248" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/Setting4.jpg" width="196"&gt;&lt;/a&gt;&lt;a class="link" href="Setting5.jpg" &gt;&lt;img alt="Setting5" class="gallery-image" data-flex-basis="83px" data-flex-grow="34" height="523" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/Setting5.jpg" width="181"&gt;&lt;/a&gt;
&lt;strong&gt;Chain Settings&lt;/strong&gt; is where you can link the selected are to another area, so this area follows the selected area&amp;rsquo;s profile.
&lt;strong&gt;Max/Min Status&lt;/strong&gt; holds the maximum and minimum recorded Temp,Rain,Moisture an Light values.
&lt;strong&gt;Calc Settings&lt;/strong&gt; are only for the irrigation profile for this area. The window below sets this.
&lt;a class="link" href="P10.jpg" &gt;&lt;img alt="P10" class="gallery-image" data-flex-basis="253px" data-flex-grow="105" height="840" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/P10.jpg" srcset="https://www.lizerd.se/projects/finished/irrigation-system/P10_hu_3dc826cd81d4e9a5.jpg 800w, https://www.lizerd.se/projects/finished/irrigation-system/P10.jpg 888w" width="888"&gt;&lt;/a&gt;
I have been experimenting with different Irrigation profiles and have implemented one that enables various settings. The &amp;ldquo;Calculated Time&amp;rdquo; box enables you to test various weather scenarios.  If  the area has Temp,Rain,Soil moisture or Light Sensors linked or only one sensor, this profile can calculate the Irrigations.
The values in the picture are not for a real profile, they are just for show.&lt;/p&gt;
&lt;h2 id="main-unit"&gt;&lt;a href="#main-unit" class="header-anchor"&gt;&lt;/a&gt;Main Unit
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="B4.jpg" &gt;&lt;img alt="B4" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/B4.jpg" srcset="https://www.lizerd.se/projects/finished/irrigation-system/B4_hu_93b33aa412c4c6f2.jpg 800w, https://www.lizerd.se/projects/finished/irrigation-system/B4.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="B6.jpg" &gt;&lt;img alt="B6" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/B6.jpg" srcset="https://www.lizerd.se/projects/finished/irrigation-system/B6_hu_9494214f56139095.jpg 800w, https://www.lizerd.se/projects/finished/irrigation-system/B6.jpg 1024w" width="1024"&gt;&lt;/a&gt;
The main unit is based on a  STM32F103 32-bit MCU. It is connects to the modules by two opto-isolated RS485 networks. There is one radio port that can be used if a wider range is needed. This is done with wireless routers that extend the RS485 network. The Main unit only needs a computer during the setup, but if the user wants a displayed overview (almost) in real time the computer can log and display the current status of the system. The main unit connects to the computer trough USB or Bluetooth.
&lt;a class="link" href="B1.jpg" &gt;&lt;img alt="B1" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/B1.jpg" srcset="https://www.lizerd.se/projects/finished/irrigation-system/B1_hu_ab5a2a87887d01d5.jpg 800w, https://www.lizerd.se/projects/finished/irrigation-system/B1.jpg 1024w" width="1024"&gt;&lt;/a&gt;
I have made one water level sensor board that can control one water solenoid. This one is specifically made for the &amp;ldquo;Ebb and Flood irrigation technique&amp;rdquo;.  It is based on capacitive sensor technique so the PCB do not need direct contact with the water.
&lt;a class="link" href="B12.jpg" &gt;&lt;img alt="B12" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="450" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/B12.jpg" width="600"&gt;&lt;/a&gt;
&lt;a class="link" href="B13.jpg" &gt;&lt;img alt="B13" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="450" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/irrigation-system/B13.jpg" width="600"&gt;&lt;/a&gt;
This is my standard board that I can connect to moisture, light, logic, analog and rain sensors.  It has an internal temp sensor but the module can connect to external temp sensor with higher precision if needed. The board also contains four output signals for activators like water solenoids.  The module is powered trough the RS485 network and uses sleep modes to reduce power consumption. The plan is to integrate a bootloader so that each module can be upgraded from the main unit.
More module versions will be create. They can be used for various functions in the system.
For example&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Motor controller for fans and venting hatches.&lt;/li&gt;
&lt;li&gt;Water nutrient concentration sensor.&lt;/li&gt;
&lt;li&gt;Wall mounted buttons and information displays.&lt;/li&gt;
&lt;li&gt;And more &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Communication between the main unit and the modules is done trough a RS485 network with 32-bit address space. It uses data packages with CRC and ACK / resend functionality to ensure that right data is sent and received by the right module.
The main unit can scan the network and request each module&amp;rsquo;s ID that is connected and responding. The modules and main unit restart if  they by any chance happen to hang. The main unit can send a restart command trough the network if it detects a continuous error respond from any module. This is mostly not a problem, but if  it by any chance should be,  the main unit has the ability to reset the network.&lt;/p&gt;
&lt;h2 id="simple-video-in-swedish"&gt;&lt;a href="#simple-video-in-swedish" class="header-anchor"&gt;&lt;/a&gt;Simple video in Swedish
&lt;/h2&gt;&lt;p&gt;&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/EucXpRTIuHg" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

More to come later on..&lt;/p&gt;</description></item><item><title>KTH Segway</title><link>https://www.lizerd.se/projects/finished/kth-segway-real/</link><pubDate>Fri, 11 Apr 2014 00:00:00 +0000</pubDate><guid>https://www.lizerd.se/projects/finished/kth-segway-real/</guid><description>&lt;img src="https://www.lizerd.se/" alt="Featured image of post KTH Segway" /&gt;&lt;p&gt;While I worked on my own segway I got a request from my University (KTH) to create a vehicle that the students should be able to test their control system theories on. So I created an improved version based on my own segway.
My motto for this project was the same as for my own version&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;em&gt;Highly optimized controller and power boards give you the freedom to implement more advanced model functions without the need  for workarounds.
It should also be sturdy and hard to break.&lt;/em&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;This is the result
Cad
&lt;a class="link" href="Scooter_V2_render_002.jpg" &gt;&lt;img alt="Scooter_V2_render_002" class="gallery-image" data-flex-basis="507px" data-flex-grow="211" height="567" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/Scooter_V2_render_002.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/Scooter_V2_render_002_hu_c6cf3c2fe25311c.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/Scooter_V2_render_002.jpg 1200w" width="1200"&gt;&lt;/a&gt;
Two KTH students using the vehicle.
&lt;a class="link" href="20130709_111211-Medium.jpg" &gt;&lt;img alt="20130709_111211 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/20130709_111211-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/20130709_111211-Medium_hu_2d422d772109dff2.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/20130709_111211-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="DSC01455.jpg" &gt;&lt;img alt="DSC01455" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01455.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01455_hu_72093368443244ea.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC01455.jpg 1152w" width="1152"&gt;&lt;/a&gt; &lt;a class="link" href="DSC01465.jpg" &gt;&lt;img alt="DSC01465" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01465.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01465_hu_40a613450b88853c.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC01465.jpg 1152w" width="1152"&gt;&lt;/a&gt;
&lt;a class="link" href="DSC01332.jpg" &gt;&lt;img alt="DSC01332" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01332.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01332_hu_b6a183015f00d7e4.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC01332.jpg 1152w" width="1152"&gt;&lt;/a&gt;
.
I used the same PCB board solution as in my homemade version.
&lt;a class="link" href="DSC05214-Medium.jpg" &gt;&lt;img alt="DSC05214 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05214-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05214-Medium_hu_5c36051e2e894311.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05214-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
A bit better shielding than in my home made version.
&lt;a class="link" href="DSC05190-Medium.jpg" &gt;&lt;img alt="DSC05190 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05190-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05190-Medium_hu_acc953c60cacabe6.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05190-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
I used two 1.5 Hp motors with with almost no backlash in the gears.
I used encoders that give me 8000 pulses per wheel rotation.
&lt;a class="link" href="DSC05115-Medium.jpg" &gt;&lt;img alt="DSC05115 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05115-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05115-Medium_hu_f868736819d9290d.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05115-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
Due to the motor power my motor drivers had to be able to handle the large current. The first step was to increase the copper area of the PCB power signal ways.
&lt;a class="link" href="DSC05307-Medium.jpg" &gt;&lt;img alt="DSC05307 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05307-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05307-Medium_hu_729db3ebe95434d3.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05307-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;&lt;a class="link" href="DSC05337-Medium.jpg" &gt;&lt;img alt="DSC05337 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05337-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05337-Medium_hu_f14ae9e666459064.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05337-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="DSC05364-Medium.jpg" &gt;&lt;img alt="DSC05364 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05364-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05364-Medium_hu_f66581fd0ff60e54.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05364-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
I also changed the mosfets to IRFB3006PbF that can handle 195A continuous and 1080A pulsed. There are three mosfets for each branch in the H-bridge.
&lt;a class="link" href="DSC05437-Medium.jpg" &gt;&lt;img alt="DSC05437 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05437-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05437-Medium_hu_6b64c704754178f2.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05437-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="DSC01262.jpg" &gt;&lt;img alt="DSC01262" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01262.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01262_hu_3e2b8604b36feb92.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC01262.jpg 1152w" width="1152"&gt;&lt;/a&gt;
. Power distribution board. Handles how the system is powered on, before we had one power switch. Now the system is always on and checks if the segway is in use or should power down parts to conserve power. Or shut down in a safe manner to protect the battery&amp;rsquo;s or if there is any other problem. in off state the board consumes an average of ~255uA @33V,  this is made possible by using a super cap. So the regulators are only active during the charge of the super cap, after that the system is in sleep until the cap needs to be recharged. In afterthought I would have added a separate switch for the switch regulator IC&amp;rsquo;s, and cut the current consumption to about 50uA instead.
&lt;a class="link" href="DSC01305.jpg" &gt;&lt;img alt="DSC01305" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01305.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01305_hu_1b3df0bbb0440700.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC01305.jpg 1152w" width="1152"&gt;&lt;/a&gt;
.
High power switch to control when the motors should be powered, and shut down on failure or to preserve power.
The boards in the picture is not fully assembled.
I made a new LCD unit
&lt;a class="link" href="DSC05496-Medium.jpg" &gt;&lt;img alt="DSC05496 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05496-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05496-Medium_hu_69197a28250aeca.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05496-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="DSC05546-Medium.jpg" &gt;&lt;img alt="DSC05546 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05546-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05546-Medium_hu_ad25649015c768e2.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05546-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
small demo video of the LCD touch function
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/fN" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

The new LCD unit has touch a interface and a menu that can be used to adjust settings while driving.
It also displays the KTH logo at power up :)
I added better suited motor driver current sensors
&lt;a class="link" href="DSC02942-Medium.jpg" &gt;&lt;img alt="DSC02942 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC02942-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC02942-Medium_hu_6a12cf37ff0cd569.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC02942-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="DSC01478.jpg" &gt;&lt;img alt="DSC01478" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01478.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC01478_hu_110c97a53ba8a5a5.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC01478.jpg 1152w" width="1152"&gt;&lt;/a&gt;
The battery&amp;rsquo;s are charged and balanced by this unit.&lt;/p&gt;
&lt;h2 id=""&gt;&lt;a href="#" class="header-anchor"&gt;&lt;/a&gt;
&lt;/h2&gt;&lt;h2 id="structure"&gt;&lt;a href="#structure" class="header-anchor"&gt;&lt;/a&gt;Structure
&lt;/h2&gt;&lt;p&gt;The structure is almost the same as my home made version.
(New version uses LiFe battery&amp;rsquo;s instead of VRLA ones, and the new power distribution board is not in the structure picture)
&lt;a class="link" href="MainStructure3.png" &gt;&lt;img alt="MainStructure3" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="720" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/MainStructure3.png" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/MainStructure3_hu_c848da20648dc576.png 800w, https://www.lizerd.se/projects/finished/kth-segway-real/MainStructure3.png 960w" width="960"&gt;&lt;/a&gt;
Connections between each part of the system
&lt;a class="link" href="Structure_cables_small.jpg" &gt;&lt;img alt="Structure_cables_small" class="gallery-image" data-flex-basis="349px" data-flex-grow="145" height="394" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/Structure_cables_small.jpg" width="573"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="softwarefirmware"&gt;&lt;a href="#softwarefirmware" class="header-anchor"&gt;&lt;/a&gt;Software/Firmware
&lt;/h2&gt;&lt;p&gt;I wrote C code that is easy for the students to follow and to start with. This way they can get started with the control theory quickly. This is to free them from having to spend several hours with the base part of the code that makes the rest of the machine work. I even included auto calibration on motor drivers so the students can recalibrate the drivers if they overwrite the values. I included a start-up function on each board so if the student by accident put the main board code in the motor board the code would stop and indicate that the wrong code has been loaded. There is a lot of small things like this to make the development as pain free as possible.
With the better sensors the logging result was a pleasure.
&lt;a class="link" href="Kalman-VS-Comp.jpg" &gt;&lt;img alt="Kalman VS Comp" class="gallery-image" data-flex-basis="537px" data-flex-grow="223" height="536" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/Kalman-VS-Comp.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/Kalman-VS-Comp_hu_8db13aa17891013c.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/Kalman-VS-Comp.jpg 1200w" width="1200"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="parts"&gt;&lt;a href="#parts" class="header-anchor"&gt;&lt;/a&gt;Parts
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="millingSide.jpg" &gt;&lt;img alt="millingSide" class="gallery-image" data-flex-basis="428px" data-flex-grow="178" height="672" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/millingSide.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/millingSide_hu_fb4d975e257ee531.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/millingSide.jpg 1200w" width="1200"&gt;&lt;/a&gt;
&lt;a class="link" href="DSC05071-Medium.jpg" &gt;&lt;img alt="DSC05071 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05071-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05071-Medium_hu_cea4dede2c162148.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05071-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="DSC05092-Medium.jpg" &gt;&lt;img alt="DSC05092 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05092-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05092-Medium_hu_5aee66511722d3d4.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05092-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
&lt;a class="link" href="DSC05094-Medium.jpg" &gt;&lt;img alt="DSC05094 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05094-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05094-Medium_hu_2ba6d87641d8adcb.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05094-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="pictures-of-the-segway"&gt;&lt;a href="#pictures-of-the-segway" class="header-anchor"&gt;&lt;/a&gt;pictures of the segway
&lt;/h2&gt;&lt;p&gt;I will add more soon
&lt;a class="link" href="DSC05579-Medium1.jpg" &gt;&lt;img alt="DSC05579 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05579-Medium1.jpg" srcset="https://www.lizerd.se/projects/finished/kth-segway-real/DSC05579-Medium1_hu_db793ce177fb0d5d.jpg 800w, https://www.lizerd.se/projects/finished/kth-segway-real/DSC05579-Medium1.jpg 1024w" width="1024"&gt;&lt;/a&gt;
I made a small time laps video, more like a test, there is one frame that keeps showing up.
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/SyMcJ5Ax7wg" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;</description></item><item><title>FlashUnit</title><link>https://www.lizerd.se/projects/finished/flashunit/</link><pubDate>Sun, 26 Aug 2012 00:00:00 +0000</pubDate><guid>https://www.lizerd.se/projects/finished/flashunit/</guid><description>&lt;img src="https://www.lizerd.se/" alt="Featured image of post FlashUnit" /&gt;&lt;h1 id="flash-programmer"&gt;&lt;a href="#flash-programmer" class="header-anchor"&gt;&lt;/a&gt;Flash Programmer
&lt;/h1&gt;&lt;p&gt;Sony had a major problem with one of there HDD recorder. The problem was that the main memory chip became worthless and the device could not start. The memory contained the player&amp;rsquo;s software. The only way to load the program files into the memory was through a dvd update disc, and the unit had to be operating for that to work. And all new memory chips was empty so there was no way to solve the problem.
So the units were replaced and the not working ones were stacked waiting for a solution. I managed to find data sheets to to the memory circuit, and hoped that the security features are not activated in the units memory. An rig was built for testing the the hdd player memory.
&lt;a class="link" href="sony.jpg" &gt;&lt;img alt="sony.jpg" class="gallery-image" data-flex-basis="359px" data-flex-grow="149" height="667" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/flashunit/sony.jpg" srcset="https://www.lizerd.se/projects/finished/flashunit/sony_hu_a7e26c15db486d7b.jpg 800w, https://www.lizerd.se/projects/finished/flashunit/sony.jpg 1000w" width="1000"&gt;&lt;/a&gt; &lt;a class="link" href="sony2.jpg" &gt;&lt;img alt="sony2.jpg" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="665" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/flashunit/sony2.jpg" srcset="https://www.lizerd.se/projects/finished/flashunit/sony2_hu_3c5a9aa5f1e7d408.jpg 800w, https://www.lizerd.se/projects/finished/flashunit/sony2.jpg 1000w" width="1000"&gt;&lt;/a&gt;
After a confirmed that the memory was open and a could extract the data, then i created a PC program that could act as host..
&lt;img alt="sony5.jpg" class="gallery-image" data-flex-basis="288px" data-flex-grow="120" height="800" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/flashunit/sony5.jpg" srcset="https://www.lizerd.se/projects/finished/flashunit/sony5_hu_f1a47f23c755c37a.jpg 800w, https://www.lizerd.se/projects/finished/flashunit/sony5.jpg 960w" width="960"&gt;
When the first test was successful, a second test board was created.
&lt;a class="link" href="sony3.jpg" &gt;&lt;img alt="sony3.jpg" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="665" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/flashunit/sony3.jpg" srcset="https://www.lizerd.se/projects/finished/flashunit/sony3_hu_373a739b1296439a.jpg 800w, https://www.lizerd.se/projects/finished/flashunit/sony3.jpg 1000w" width="1000"&gt;&lt;/a&gt;
The new connection solution was not a stable solution, the results was not satisfying. there is a reason why there is gold plated connections on edge connectors :)
The best solution would be if a large circuit socket was mounted instead of needing to solder the memory, but that was to expensive at the time. So I updated the first version and sent it for manufacturing.
&lt;a class="link" href="sony1.jpg" &gt;&lt;img alt="sony1.jpg" class="gallery-image" data-flex-basis="359px" data-flex-grow="149" height="401" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/flashunit/sony1.jpg" width="600"&gt;&lt;/a&gt;
And the host program was redesigned to be more easy to operate.
&lt;a class="link" href="sony4.jpg" &gt;&lt;img alt="sony4.jpg" class="gallery-image" data-flex-basis="286px" data-flex-grow="119" height="800" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/flashunit/sony4.jpg" srcset="https://www.lizerd.se/projects/finished/flashunit/sony4_hu_b2bbd21a9752eafc.jpg 800w, https://www.lizerd.se/projects/finished/flashunit/sony4.jpg 956w" width="956"&gt;&lt;/a&gt;
After that , it worked fine to revive the old units.&lt;/p&gt;</description></item><item><title>Home Made Segway</title><link>https://www.lizerd.se/projects/finished/my-homemade-segway/</link><pubDate>Sun, 26 Aug 2012 00:00:00 +0000</pubDate><guid>https://www.lizerd.se/projects/finished/my-homemade-segway/</guid><description>&lt;img src="https://www.lizerd.se/" alt="Featured image of post Home Made Segway" /&gt;&lt;p&gt;I have been working on this idea for a while now, to build my own segway clone.
It hass been a while since I started this project and finally it is working as hoped.
&lt;a class="link" href="Seggan-MePic.jpg" &gt;&lt;img class="gallery-image" data-flex-basis="157px" data-flex-grow="65" data-title-escaped="Seggan MePic" height="919" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/Seggan-MePic.jpg" title="Seggan MePic" width="602"&gt;&lt;/a&gt;
I made a demo video, as for now it is only a Swedish version is available.
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/1NunWVa63HY" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

My idea is that I want hardware that doesn’t bring any model or programming limits. There should be no need for workarounds or mysterious functions to make the model work. There should be enough processor power so you don’t have to design your model according to hardware limitations.
The theory will seem more genuine if you are not too limited by the hardware. I have based the design on my ideas on how to best implement the simplest solution that still has more processor capabilities than needed.
My motto for this project was&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;em&gt;Highly optimized controller and power boards give you freedom to implement more advanced model functions without the need of workarounds.&lt;/em&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;There is a loot of stuff in this machine, I will try to show the most interesting parts :)&lt;/p&gt;
&lt;h2 id="the-structure-of-the-electronics"&gt;&lt;a href="#the-structure-of-the-electronics" class="header-anchor"&gt;&lt;/a&gt;The structure of the electronics
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="StructureMain.png" &gt;&lt;img class="gallery-image" data-flex-basis="320px" data-flex-grow="133" data-title-escaped="StructureMain" height="720" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/StructureMain.png" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/StructureMain_hu_a8750befdbefa647.png 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/StructureMain.png 960w" title="StructureMain" width="960"&gt;&lt;/a&gt;
&lt;a class="link" href="909.jpg" &gt;&lt;img alt="909" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="450" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/909.jpg" width="600"&gt;&lt;/a&gt;
The MainBoard, MotorBoard and SensorBoard are housed inside the black box  you see above.
&lt;a class="link" href="DSC05163-Medium.jpg" &gt;&lt;img alt="DSC05163 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/DSC05163-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/DSC05163-Medium_hu_e0e9a006ae299e04.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/DSC05163-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
The black box contains 3 boards. Right now the box is made of wood, but it will be replaced by one made of aluminum soon for better shielding properties.
&lt;a class="link" href="s10.jpg" &gt;&lt;img alt="s10" class="gallery-image" data-flex-basis="702px" data-flex-grow="292" height="205" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/s10.jpg" width="600"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="mainboard"&gt;&lt;a href="#mainboard" class="header-anchor"&gt;&lt;/a&gt;MainBoard
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="MainBoart_Top-Medium.jpg" &gt;&lt;img alt="MainBoart_Top (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/MainBoart_Top-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/MainBoart_Top-Medium_hu_4550e8be2b19667d.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/MainBoart_Top-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt; &lt;a class="link" href="MainBoard_Back-Medium.jpg" &gt;&lt;img alt="MainBoard_Back (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/MainBoard_Back-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/MainBoard_Back-Medium_hu_14176ce2dbae0eec.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/MainBoard_Back-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
The main board is a separate board that holds the vital peripherals and has access to all the data of the system. This is the central processing unit of the segway. The main board is a separated board, and this enables a board design that is more resistant to external interference, such as the electrical noise generated by the motor board and motors. This is vital for a good signal to noise ratio on the ADC design that samples the sensors. Without this the sensor readings get noisy and precision is reduced. This is the board that holds the control system that makes the segway balance.
Communications between the main board and the motor board are trough SPI for the high speed data, and trough UART for the slower data instructions.&lt;/p&gt;
&lt;h2 id="motorboard"&gt;&lt;a href="#motorboard" class="header-anchor"&gt;&lt;/a&gt;MotorBoard
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="MotorBoard_Back-Medium.jpg" &gt;&lt;img alt="MotorBoard_Back (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/MotorBoard_Back-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/MotorBoard_Back-Medium_hu_85741d52c012d5b6.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/MotorBoard_Back-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;&lt;a class="link" href="MotorBoard_Top-Medium.jpg" &gt;&lt;img alt="MotorBoard_Top (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/MotorBoard_Top-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/MotorBoard_Top-Medium_hu_2720d5f7392dad08.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/MotorBoard_Top-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
The motor board gets control data from the main board and interacts with the motor driver to adjust the motor power. The main reason this board has it&amp;rsquo;s own processor is that if the main board hangs due to code that are under development or for some other reason, the motor board can still actively control the motors. It can then ramp the power down if it senses that the periodic update from main board is lost. This gives you a better chance to get off the vehicle if the motors are stuck on high power or if there is a sudden loss of power to the motors.
Another reason is that motor board  can handle the motor power control loop with feedback from motor encoder in a dedicated processor instead of having to share the load on the main board processor. This means that I have a lot of processor power only for the motor control loop and I can implement more advanced algorithms without having to consider load regulations.
The board also have two current sensor inputs, sensing +- current to each motor driver. This means that the board can sense the power load on the motors.&lt;/p&gt;
&lt;h2 id="sensorboard"&gt;&lt;a href="#sensorboard" class="header-anchor"&gt;&lt;/a&gt;SensorBoard
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="sensorBoard_V3-Medium.jpg" &gt;&lt;img alt="sensorBoard_V3 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/sensorBoard_V3-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/sensorBoard_V3-Medium_hu_c8113408611520f1.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/sensorBoard_V3-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
The board contains one  SPI Gyroscope ADXRS450 ±300°/sec, and two MXA2500G ±1.7 g (2 axis each) that has an angular offset of 45deg to each other.
The board is made so it is easy to make a new version. This way I could test various solutions. The current board is my third version.
My main goal with this project was to be able to test and learn control systems, and sensors are a big part of that.&lt;/p&gt;
&lt;h2 id="motor-driver"&gt;&lt;a href="#motor-driver" class="header-anchor"&gt;&lt;/a&gt;Motor Driver
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="MotorDriver-Medium.jpg" &gt;&lt;img alt="MotorDriver (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/MotorDriver-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/MotorDriver-Medium_hu_1c0fee760be0304b.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/MotorDriver-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
The motor driver is made of H-bridge driver HIP4081A controlling 12 FDP030N06 mosfets. Each mosfet is capable of 120A continuous and ~700A peak current. Each branch in the H-bridge holds 3 FDP030N06 and should be able to handle much more power then the 250W motors will need.
I have mounted a digital temp sensor on the heat sink with a resolution of 0.03125°C, so i can monitor the dissipated heat from the mosfets.&lt;/p&gt;
&lt;h2 id="power-distribution-board"&gt;&lt;a href="#power-distribution-board" class="header-anchor"&gt;&lt;/a&gt;Power Distribution Board
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="PowerBoard-Medium.jpg" &gt;&lt;img alt="PowerBoard (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/PowerBoard-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/PowerBoard-Medium_hu_16186edcef6fc1a7.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/PowerBoard-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
This board regulates the battery voltage (24v) to 14.4v to motor drivers and 8v to the box with main/motor/sensor board.&lt;/p&gt;
&lt;h2 id="steering-lcd-unit"&gt;&lt;a href="#steering-lcd-unit" class="header-anchor"&gt;&lt;/a&gt;Steering LCD unit
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="SteeringUnit.jpg" &gt;&lt;img alt="SteeringUnit" class="gallery-image" data-flex-basis="200px" data-flex-grow="83" height="720" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/SteeringUnit.jpg" width="600"&gt;&lt;/a&gt;
I made this of one of my test PCB boards. The LCD has touch functionality but it is not implemented in this version. On the screen I can monitor the angle of the segway as well as voltages, currents, consumed power, motor driver power and temperature. I can also see traveled distance and speed, but it is on a newer version of the software than the one used in this picture.&lt;/p&gt;
&lt;h2 id="charger"&gt;&lt;a href="#charger" class="header-anchor"&gt;&lt;/a&gt;Charger
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="ChargerBoard-Medium.jpg" &gt;&lt;img alt="ChargerBoard (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/ChargerBoard-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/ChargerBoard-Medium_hu_cb1601ad3534c3d8.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/ChargerBoard-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
I made a charger that I could place inside the segway so it would be easy to charge the batteries. The batteries are limited to 3A charge current, and the charger is using a 3 step charge mode. It holds information about charged Ah, and voltage, current and  temp can be requested trough the UART connector.&lt;/p&gt;
&lt;h2 id="motors"&gt;&lt;a href="#motors" class="header-anchor"&gt;&lt;/a&gt;Motors
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="motors.jpg" &gt;&lt;img alt="motors" class="gallery-image" data-flex-basis="401px" data-flex-grow="167" height="718" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/motors.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/motors_hu_f8f87e55ee27962d.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/motors.jpg 1200w" width="1200"&gt;&lt;/a&gt;
The motors were one of the hardest parts of the segway to find. They needed to have the right specifications and be reasonable priced. Thanks to friends I got one motor for free and two more for a small price. The three motors became two after selecting the best parts. The motor power is about 250W and it is equipped with a worm gear that has an awful backlash. The motors were in used condition so I knew that I would have some problem with the control system due to the big backlash.
Currently I am using some nifty encoder from a camera for motor feedback. I must find a better suited encoder so I can use the encoder data in the motor control loop. But it is hard to find a well suited encoder that is small enough as well as reliable. I am still looking for one.
If I can use the encoder feedback I can almost completely eliminate the backlash problem - that would be really nice.&lt;/p&gt;
&lt;h2 id="debugging-capabilities"&gt;&lt;a href="#debugging-capabilities" class="header-anchor"&gt;&lt;/a&gt;Debugging capabilities
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="099.jpg" &gt;&lt;img alt="099" class="gallery-image" data-flex-basis="536px" data-flex-grow="223" height="537" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/099.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/099_hu_c8a6f3323d853d60.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/099.jpg 1200w" width="1200"&gt;&lt;/a&gt;
I have created a PC logging program that I use for logging data in real time trough Bluetooth or USB. With the program I can read and set control values in the segway, even while it is running.
&lt;a class="link" href="Ext11.jpg" &gt;&lt;img alt="Ext1" class="gallery-image" data-flex-basis="495px" data-flex-grow="206" height="581" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/Ext11.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/Ext11_hu_9a6789827adb6c1e.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/Ext11.jpg 1200w" width="1200"&gt;&lt;/a&gt;
Both the main board and motor board have JTAG and USB communication that can be used to debug processors and output data. JTAG is a direct bus to the processor and can be used to read out almost every step the processor makes as well as settings and data.
USB is mostly for sending log data that can be saved as a file or viewed in real-time through the pc program. It enables multi signal view with high detail, which can be saved in various data formats. The program can be used for sending data and commands to the target board with regulator settings etc. By saving logged data in a file and with a large number of formatting options the file can be used for many other purposes.
While the segway is running the radio communication can be used instead of the usb communication. The major difference is only the amount of data that can be logged.&lt;/p&gt;
&lt;h2 id="my-angle-measurement-jigg"&gt;&lt;a href="#my-angle-measurement-jigg" class="header-anchor"&gt;&lt;/a&gt;My angle measurement jigg
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="s16.jpg" &gt;&lt;img alt="s16" class="gallery-image" data-flex-basis="180px" data-flex-grow="75" height="800" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/s16.jpg" width="600"&gt;&lt;/a&gt;
&lt;a class="link" href="s15.jpg" &gt;&lt;img alt="s15" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="450" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/s15.jpg" width="600"&gt;&lt;/a&gt;
Used for testing and calibrating the sensors
&lt;a class="link" href="DSC04513-Medium.jpg" &gt;&lt;img alt="DSC04513 (Medium)" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="768" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/DSC04513-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/DSC04513-Medium_hu_b1bc691841b5a58c.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/DSC04513-Medium.jpg 1024w" width="1024"&gt;&lt;/a&gt;
Testing and calibrating the motor driver.&lt;/p&gt;
&lt;h3 id="beta-boards"&gt;&lt;a href="#beta-boards" class="header-anchor"&gt;&lt;/a&gt;Beta Boards
&lt;/h3&gt;&lt;p&gt;I did make a beta version of the solution at first.
Mainboard
&lt;a class="link" href="S3.jpg" &gt;&lt;img alt="S3" class="gallery-image" data-flex-basis="464px" data-flex-grow="193" height="310" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/S3.jpg" width="600"&gt;&lt;/a&gt;
Motor Board + Motor Driver
&lt;a class="link" href="S4.jpg" &gt;&lt;img alt="S4" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="450" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/S4.jpg" width="600"&gt;&lt;/a&gt;
Sensors, also with the same &amp;ldquo;easy change&amp;rdquo; -concept
&lt;a class="link" href="IMAG0126-Medium.jpg" &gt;&lt;img alt="IMAG0126 (Medium)" class="gallery-image" data-flex-basis="401px" data-flex-grow="167" height="718" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/IMAG0126-Medium.jpg" srcset="https://www.lizerd.se/projects/finished/my-homemade-segway/IMAG0126-Medium_hu_dd6f1302c831d4b.jpg 800w, https://www.lizerd.se/projects/finished/my-homemade-segway/IMAG0126-Medium.jpg 1200w" width="1200"&gt;&lt;/a&gt;
I first made an external charger, but i changed my mind when i did realize I could fit the charger inside the segway instead.
&lt;a class="link" href="S11.jpg" &gt;&lt;img alt="S11" class="gallery-image" data-flex-basis="401px" data-flex-grow="167" height="359" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/S11.jpg" width="600"&gt;&lt;/a&gt;
&lt;a class="link" href="s12.jpg" &gt;&lt;img alt="s12" class="gallery-image" data-flex-basis="401px" data-flex-grow="167" height="359" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/my-homemade-segway/s12.jpg" width="600"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="other"&gt;&lt;a href="#other" class="header-anchor"&gt;&lt;/a&gt;Other
&lt;/h2&gt;&lt;p&gt;I made some high speed PCB cad and soldering videos based on the segway mainboard and motorboard
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/tSBGInrYaRQ" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/7aELI8oadKo" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;</description></item><item><title>Lego Segway</title><link>https://www.lizerd.se/projects/finished/lego-segway/</link><pubDate>Sun, 26 Aug 2012 00:00:00 +0000</pubDate><guid>https://www.lizerd.se/projects/finished/lego-segway/</guid><description>&lt;img src="https://www.lizerd.se/" alt="Featured image of post Lego Segway" /&gt;&lt;p&gt;&lt;a class="link" href="LegoSegway1.jpg" &gt;&lt;img alt="Segway.jpg" class="gallery-image" data-flex-basis="263px" data-flex-grow="109" height="547" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/lego-segway/Segway.jpg" width="600"&gt;&lt;/a&gt;
This project was done at KTH Elekro for a project course.
This course mostly aimed for project management in groups of five persons, the project our group got was to build a segway robot based on lego mindstorm kit.
The problem was that no group before was able to make the robot stand for more then 12 seconds. Only the PhD student group was able to create a robot that could stand without time limit. The goal was to beat the PhD student&amp;rsquo;s time.
My main role in this project was to create the empirical model of a lego segway robot, and this is what I did. we only had access to the lego mindstorm kit the two last weeks, so it was very important that the theory was done before we got the lego kit.
Given the time limit it was important to collect as much information as possible before creating the basic control system structure. For the sensor data collection, I built a test rig with accelerometers and gyros, and put together a signal logging program.
&lt;a class="link" href="Sensorkort.jpg" &gt;&lt;img alt="Sensorkort (Custom).jpg" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="450" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/lego-segway/Sensorkort-Custom.jpg" width="600"&gt;&lt;/a&gt;
With this test rig the different angular algorithms could be tested.
A idea was to be able to use the rig on the final lego robot. but after implementation to the lego robot data interface a big flaw was detected. The data transfer was to slow and took to much process power when I implemented it in the lego unit. So the idea was scraped.
We went away from the recommended programing language, the lego unit uses a so called Real time operating software. And I knew the importance of selecting the right programing language when the processor resources are limited.
And I went with Robot C that has the best performance when used with the integrated software in the lego unit. I could skip the integrated software and write processor compiled code, but that would take much more time than a could afford for the project.
It was not so difficult to get the robot standing only with the gyro sensor, but it had a awful gyro drift fault, this cannot be calculated, and it gives sporadic data faults.
When I tried to integrate the accelerometer in the control algorithm the extra time delayed when fetching the accelerometer data made the robot much more unstable.
So instead of the accelerometer I used the wheel sensor, this sensor does not have the best performance, but that was solved with moving average type collector.
Here is the final control system for the segway robot
&lt;a class="link" href="Bild1.JPG" &gt;&lt;img alt="Bild1 (Custom).JPG" class="gallery-image" data-flex-basis="320px" data-flex-grow="133" height="450" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/lego-segway/Bild1-Custom.JPG" width="600"&gt;&lt;/a&gt;
Then I created a function in my logging program that enable me to send control data trough Bluetooth and control the robot with the PC mouse movements.
The PhD studens robot could only stand still on the same spot or run forward with a constant speed.
&lt;a class="link" href="RemoteJoystick.JPG" &gt;&lt;img alt="RemoteJoystick (Custom).JPG" class="gallery-image" data-flex-basis="463px" data-flex-grow="192" height="311" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/lego-segway/RemoteJoystick-Custom.JPG" width="600"&gt;&lt;/a&gt;
Final result.
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/FFw-UJHeeZU" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;

Video 2  &amp;quot; Not the best video quality&amp;quot;
&lt;div class="video-wrapper"&gt;
 &lt;iframe loading="lazy" 
 src="https://www.youtube.com/embed/3g1tLLB44Jw" 
 allowfullscreen 
 title="YouTube Video"
 &gt;
 &lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;</description></item><item><title>StepMaster</title><link>https://www.lizerd.se/projects/finished/stepmaster/</link><pubDate>Sun, 26 Aug 2012 00:00:00 +0000</pubDate><guid>https://www.lizerd.se/projects/finished/stepmaster/</guid><description>&lt;img src="https://www.lizerd.se/" alt="Featured image of post StepMaster" /&gt;&lt;h1 id="small-but-flexible-intelligent-stand-alone-stepper-motor-controller"&gt;&lt;a href="#small-but-flexible-intelligent-stand-alone-stepper-motor-controller" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;Small but flexible intelligent stand alone stepper motor controller.&lt;/strong&gt;
&lt;/h1&gt;&lt;p&gt;This product was made for a motor company.
They had a programmable and independent motor controller that was to expensive and with low flexibility. So they asked me if a could do a better and cheaper version. It was a challenge to build it so small with that much motor power .
&lt;a class="link" href="3.JPG" &gt;&lt;img alt="3.JPG" class="gallery-image" data-flex-basis="358px" data-flex-grow="149" height="480" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/stepmaster/3.JPG" width="717"&gt;&lt;/a&gt;
The upper board is my first Beta version. The lower one is the motor board that i should replace. It´s main features is &amp;ldquo;small but flexible intelligent stepper motor controller&amp;rdquo;.
&lt;strong&gt;Main Features&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;8 Inputs with programmable functions.&lt;/li&gt;
&lt;li&gt;2 Outputs with programmable functions.&lt;/li&gt;
&lt;li&gt;2 Amp Stepper Driver , Selectable in 20 steps from 100mA to 2000mA. 12 - 30 VDC Input voltage.&lt;/li&gt;
&lt;li&gt;Current Standby, Both Time before standby and current is programmable.&lt;/li&gt;
&lt;li&gt;2 Analog inputs with programmable functions.&lt;/li&gt;
&lt;li&gt;1/1 , 1/2 , 1/4 , 1/16 microstep is selectable by input or internal state.&lt;/li&gt;
&lt;li&gt;Programmable functions is set by a PC application.&lt;/li&gt;
&lt;li&gt;FW update can be made by customer (done in the PC application).&lt;/li&gt;
&lt;li&gt;Programmable Acceleration/Deceleration Time.&lt;/li&gt;
&lt;li&gt;Smooth motor motion in manual step mode.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Programmable Input Features&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go To Home &amp;ldquo;Position zero&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Step continuously at given direction&lt;/li&gt;
&lt;li&gt;Step xx steps at given direction&lt;/li&gt;
&lt;li&gt;Direction Step continuously at positive direction&lt;/li&gt;
&lt;li&gt;Step continuously at negative direction&lt;/li&gt;
&lt;li&gt;Step xx steps at positive direction&lt;/li&gt;
&lt;li&gt;Step xx steps at negative direction&lt;/li&gt;
&lt;li&gt;Positive end sensor input&lt;/li&gt;
&lt;li&gt;Negative end sensor input&lt;/li&gt;
&lt;li&gt;2 Inputs for speed, 4 programmable speed settings&lt;/li&gt;
&lt;li&gt;2 Inputs for current, 4 programmable current settings&lt;/li&gt;
&lt;li&gt;2 Inputs for microstep, 4 programmable microstep settings&lt;/li&gt;
&lt;li&gt;Emergency Stop, 3 different variations ( Pause ongoing function ) ( Pause and Exit all ongoing functions) ( Pause and Exit all ongoing functions and release current to motor )&lt;/li&gt;
&lt;li&gt;Emergency Reset Wait until, trigged functions is memorized and on hold until this function triggers Current standby, Releases current to motor&lt;/li&gt;
&lt;li&gt;Abort if, abort all functions when trigged&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Input Features&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;High signal in, between 4.5 to 30v is acceptable for a logic 1  (levels can be changed)&lt;/li&gt;
&lt;li&gt;Pull up signal can be applied to input, if pull up is enable, the input pin only needs to be grounded to trigger input function&lt;/li&gt;
&lt;li&gt;Functions can be set to trigger on negative &amp;ldquo;falling signal&amp;rdquo; or positive &amp;ldquo;rising signal&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Output Features&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Both outputs can handle up to 300mA current each.&lt;/li&gt;
&lt;li&gt;Outputs can be set to positive or negative response out&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Programmable Output Features&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Busy, Triggers output when device is busy or motor is running&lt;/li&gt;
&lt;li&gt;Home, when current position is zero &amp;ldquo;Home&amp;rdquo; can be set with a +- tolerance&lt;/li&gt;
&lt;li&gt;Positive, Negative, Or both end sensor. Activates output on end sensor trigger.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a class="link" href="1.JPG" &gt;&lt;img alt="1.JPG" class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="599" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/stepmaster/1.JPG" srcset="https://www.lizerd.se/projects/finished/stepmaster/1_hu_13d2d4d681236914.JPG 800w, https://www.lizerd.se/projects/finished/stepmaster/1.JPG 900w" width="900"&gt;&lt;/a&gt;
The final version. The board dimensions is 30 x 37 mm
&lt;a class="link" href="Board.png" &gt;&lt;img alt="Board.png" class="gallery-image" data-flex-basis="364px" data-flex-grow="151" height="622" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/stepmaster/Board.png" srcset="https://www.lizerd.se/projects/finished/stepmaster/Board_hu_2b3a0353169fd427.png 800w, https://www.lizerd.se/projects/finished/stepmaster/Board.png 944w" width="944"&gt;&lt;/a&gt;
I created a PC program in C#  that makes the board profile really easy to setup.
Profile
&lt;a class="link" href="sw1.jpg" &gt;&lt;img alt="sw1.jpg" class="gallery-image" data-flex-basis="310px" data-flex-grow="129" height="813" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/stepmaster/sw1.jpg" srcset="https://www.lizerd.se/projects/finished/stepmaster/sw1_hu_f883293860d2c7d1.jpg 800w, https://www.lizerd.se/projects/finished/stepmaster/sw1.jpg 1051w" width="1051"&gt;&lt;/a&gt;
Input options
Every input / output on the motor board can be set to a selected function.
&lt;a class="link" href="sw2.jpg" &gt;&lt;img alt="sw2.jpg" class="gallery-image" data-flex-basis="297px" data-flex-grow="124" height="352" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/stepmaster/sw2.jpg" width="437"&gt;&lt;/a&gt;
Main profile settings
&lt;a class="link" href="sw3.jpg" &gt;&lt;img alt="sw3.jpg" class="gallery-image" data-flex-basis="306px" data-flex-grow="127" height="824" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/stepmaster/sw3.jpg" srcset="https://www.lizerd.se/projects/finished/stepmaster/sw3_hu_e252dcae1f970ccc.jpg 800w, https://www.lizerd.se/projects/finished/stepmaster/sw3.jpg 1051w" width="1051"&gt;&lt;/a&gt;
Analog Input Settings
&lt;a class="link" href="sw4.jpg" &gt;&lt;img alt="sw4.jpg" class="gallery-image" data-flex-basis="306px" data-flex-grow="127" height="823" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/stepmaster/sw4.jpg" srcset="https://www.lizerd.se/projects/finished/stepmaster/sw4_hu_cab2cc092f17c6f.jpg 800w, https://www.lizerd.se/projects/finished/stepmaster/sw4.jpg 1052w" width="1052"&gt;&lt;/a&gt;
Device Control
Manual control of the motor.
&lt;a class="link" href="sw5.jpg" &gt;&lt;img alt="sw5.jpg" class="gallery-image" data-flex-basis="305px" data-flex-grow="127" height="822" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/stepmaster/sw5.jpg" srcset="https://www.lizerd.se/projects/finished/stepmaster/sw5_hu_13d0129fd3e41af7.jpg 800w, https://www.lizerd.se/projects/finished/stepmaster/sw5.jpg 1046w" width="1046"&gt;&lt;/a&gt;
Communication settings
&lt;a class="link" href="sw6.jpg" &gt;&lt;img alt="sw6.jpg" class="gallery-image" data-flex-basis="305px" data-flex-grow="127" height="823" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/stepmaster/sw6.jpg" srcset="https://www.lizerd.se/projects/finished/stepmaster/sw6_hu_73426d2ac6c2d663.jpg 800w, https://www.lizerd.se/projects/finished/stepmaster/sw6.jpg 1047w" width="1047"&gt;&lt;/a&gt;
Firmware Update
Built in firmware update function for easy upgrade.
&lt;a class="link" href="sw7.jpg" &gt;&lt;img alt="sw7.jpg" class="gallery-image" data-flex-basis="306px" data-flex-grow="127" height="825" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/stepmaster/sw7.jpg" srcset="https://www.lizerd.se/projects/finished/stepmaster/sw7_hu_4e383eba49ab635d.jpg 800w, https://www.lizerd.se/projects/finished/stepmaster/sw7.jpg 1054w" width="1054"&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Xremote</title><link>https://www.lizerd.se/projects/finished/xremote/</link><pubDate>Sun, 26 Aug 2012 00:00:00 +0000</pubDate><guid>https://www.lizerd.se/projects/finished/xremote/</guid><description>&lt;img src="https://www.lizerd.se/" alt="Featured image of post Xremote" /&gt;&lt;h1 id="xbox-remote-control"&gt;&lt;a href="#xbox-remote-control" class="header-anchor"&gt;&lt;/a&gt;&lt;strong&gt;Xbox Remote control&lt;/strong&gt;
&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Project created 2001&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Back in the day when I owned an XBOX I was very irritated that I needed to get up to reset the unit every time I wanted to change games.
And to be perfectly clear, I enjoy electronics more than playing games, so it was more fun to create a solution to my problem instead of playing.
I think I spend more time on creating this gadget then total playing time on the XBOX.
So I had some experience with the microchip PIC16C series micro-controllers and thought it could not be that hard to create some kind of solution to my very very big problem.
I started small by creating a debug platform. with one Nokia 3310 LCD and IR receiver, few buttons and RS232 interface.
&lt;a class="link" href="beta1.jpg" &gt;&lt;img class="gallery-image" data-flex-basis="169px" data-flex-grow="70" height="848" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/xremote/beta1.jpg" width="600"&gt;&lt;/a&gt;
Programming was done in assembler.
Processor was 16F676 with 1K Flash running on internal clock.
The major problem I had with this design was the lack of flash memory, I spent many many hours on optimizing my code to be able to fit all the functions I wanted.
I made a specific prototype.
&lt;a class="link" href="sch2.jpg" &gt;&lt;img class="gallery-image" data-flex-basis="405px" data-flex-grow="169" height="355" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/xremote/sch.jpg" width="600"&gt;&lt;/a&gt;
&lt;a class="link" href="Mounted.jpg" &gt;&lt;img class="gallery-image" data-flex-basis="458px" data-flex-grow="191" height="314" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/xremote/Mounted.jpg" width="600"&gt;&lt;/a&gt;
&lt;strong&gt;The final version contained the following functions.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IR receiver, supported multiple protocols “IR Protocol learning capability”&lt;/li&gt;
&lt;li&gt;Easy to install in the XBOX, with or without any modchip installed.&lt;/li&gt;
&lt;li&gt;4 to 10 solder points depending on configuration.&lt;/li&gt;
&lt;li&gt;12 programmable functions, easy to program.&lt;/li&gt;
&lt;li&gt;3 extra output ports for controlling extra functions, like mod lights and so on.&lt;/li&gt;
&lt;li&gt;Only a small IR eye with push bottom is visible on the front of the xbox.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Functions&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check power off             = Check if XBOX is turned off, if not turn off. (1)&lt;/li&gt;
&lt;li&gt;Power_on05                   = Start pulse 500ms long. (1)&lt;/li&gt;
&lt;li&gt;Power_on_1                   = Start pulse 1s long. (1)&lt;/li&gt;
&lt;li&gt;Power_on_2                   = Start pulse 2s long. (1)&lt;/li&gt;
&lt;li&gt;Power_on_3                   = Start pulse 3s long. (1)&lt;/li&gt;
&lt;li&gt;Power_on_Set               = Start pulse is by configurable time “0.1-7sec”. (1)&lt;/li&gt;
&lt;li&gt;Power Do Low                = Start XBOX with Do low (Modchip on/off). (1)&lt;/li&gt;
&lt;li&gt;Power Do High               = Start XBOX with Do low (Modchip on/off). (1)&lt;/li&gt;
&lt;li&gt;Eject on                            = Ejects the DVD player.&lt;/li&gt;
&lt;li&gt;Extra toggle 1                  = Extra port 1 toggle output status&lt;/li&gt;
&lt;li&gt;Extra toggle 2                  = Extra port 2 toggle output status&lt;/li&gt;
&lt;li&gt;Toggle Do                        = Toggle Modchip status, also used as Extra port 3&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;If the XBOX is already on and this functions is triggered the chip shuts down the XBOX.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="extra-ports-can-also-be-activated-toggled-when-the-xbox-is-turned-off"&gt;&lt;a href="#extra-ports-can-also-be-activated-toggled-when-the-xbox-is-turned-off" class="header-anchor"&gt;&lt;/a&gt;Extra ports can also be activated “toggled” when the XBOX is turned off.
&lt;/h1&gt;&lt;h1 id="chip-status-and-port-status-is-saved-in-the-eeprom-memory-when-the-xbox-loses-power"&gt;&lt;a href="#chip-status-and-port-status-is-saved-in-the-eeprom-memory-when-the-xbox-loses-power" class="header-anchor"&gt;&lt;/a&gt;chip status and port status is saved in the eeprom memory when the XBOX loses power.
&lt;/h1&gt;&lt;p&gt;I was so pleased with the design and functionality of the chip that I made some extra boards for a few that wanted it as well.
&lt;a class="link" href="brd.jpg" &gt;&lt;img class="gallery-image" data-flex-basis="309px" data-flex-grow="128" height="466" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/xremote/brd.jpg" width="600"&gt;&lt;/a&gt;&lt;a class="link" href="brd.jpg" &gt;&lt;img class="gallery-image" data-flex-basis="318px" data-flex-grow="132" height="381" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/xremote/IR.jpg" width="505"&gt;&lt;/a&gt;
&lt;a class="link" href="test.jpg" &gt;&lt;img class="gallery-image" data-flex-basis="360px" data-flex-grow="150" height="399" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/xremote/test.jpg" width="600"&gt;&lt;/a&gt;
&lt;a class="link" href="Xdoc.jpg" &gt;&lt;img class="gallery-image" data-flex-basis="169px" data-flex-grow="70" height="880" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://www.lizerd.se/projects/finished/xremote/Xdoc.jpg" width="622"&gt;&lt;/a&gt;
&lt;a class="link" href="Xremote.pdf" title="Manual as PDF"
 &gt;Xremote manual&lt;/a&gt;
&lt;a class="link" href="Xremote_assamble.pdf" &gt;Xremote install instructions&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>