Close
0%
0%

MI/O

Tiny microcontroller dev board, wristwatch and timer
"It's not a smart watch, it's a watch for smart people"

Similar projects worth following
ATmega328P based dev board which can be worn as a wristwatch.

1. Overview

Top side:

Bottom side:

  • 40 x 50 mm
  • Two cutouts for a wristband
  • ATmega328 microcontroller, 8MHz
  • Programmable via FTDI breakout or ISP using an Arduino Pro Mini as a programmer
  • 128 x 32 I2C OLED
  • PCF8523 Real-Time Clock (RTC) and calendar
  • Powered by a CR2032 coin cell or external power supply
  • On-board LDO for external power supplies
  • Latching style on-off, programmable automatic switch-off
  • 2 x 8-holes SMD female headers on backside to access pins; can be also used to plug in add-on modules

Casio used some kinda add-on modules like a TV remote on their 90's wristwatches:

Image courtesy of theverge.com

2. Schematic

Unlike other watch designs where the microcontroller is put into sleep mode, MI/O completely switches off everything except the RTC when the watch is not in use.

The disadvantage is that we cannot use a bootloader if the board is used as a wristwatch. With bootloader the ATmega328P needs about 2.1 seconds to boot. This is not acceptable in watch mode, because you would have to wait 2 seconds after pressing the PWR button and hold the button until the time is displayed. Fortunately we do not need a bootloader. We can program the chip directly via ISP. The time/date is then nearly shown without delay after power-up. And if we need a bootloader for other applications, we can of course burn it onto the chip.

Q1, R2 and SW2 form a simple latching style power circuit. On power up the R2 resistor pulls up the gate on the Q1 p-channel mosfet which prevents current from flowing through Q1. When the user presses SW2, the gate on Q1 gets pulled to ground which allows the current to flow, the ATmega328P turn on. It then drives the GPIO pin to ground. When the user releases SW2 the GPIO pin keeps the gate low. The ATmega328P then just Hi-Zs the GPIO pin when it needs to shutdown. This way it can make sure the data is safe when it shuts down. Q2 and Q3 enabling/disabling the I2C pullup resistors R6/R7 to avoid the devices are  being "phantom powered" via the I2C lines themselves. However, phantom powering cannot be completely prevented as R2 connects the positive terminal of the battery with an I/O of the ATmega328P, and the ATmega328P powers itself through the internal protection diodes. R2, the microcontroller and maybe other peripherals acting as a voltage divider or resistors in series. The value of the resistor R2 should therefore be set as high as possible without putting the Q1 MOSFET gate into an undefined state. If we use a value of 1MΩ for R2, we should end up with a stand-by-current of around 4µA.

Two small modifications must be made to the breakout board of the OLED1. The LDO at the backside has to be removed and VCC_IN has to be connected to VCC by a small wire jumper, see redrawn schematic of the OLED breakout below. Instead of a wire jumper a SOT23 jumper could be used. This ensures that all components on the board have the same voltage level. The OLED1 works without LDO in a voltage range of 2-4V without problems. Furthermore the 4.7k pullup resistors R3 and R4 on the OLED breakout have to be removed to avoid mentioned "phantom powering".

3. Prototype

4. Add-on modules

Just two ideas for add-on modules: USB power supply and a BME280 humidity, pressure and temperature sensor. Want more ideas? Reading light, laser cannon, keyboard, ToF-sensor, TV remote control, accelerometer, compass... Endless possibilities.

So far built add-ons:

5. Future work

The watch itself is finished as far as the hardware is concerned and is in pre-production. However, there is still some work to be done on the software side. In the future I would like to develop more add-ons for MI/O. Next, a blood glucose meter is planned, based on my work here.

This project is released under the CC-By-NC license.

BK1079-BEKEN datasheet.pdf

Datasheet of the FM radio IC BK1079, Chinese though

Adobe Portable Document Format - 445.96 kB - 05/13/2020 at 19:09

Preview
Download

  • Beta testers wanted

    M. Bindhammer06/19/2020 at 09:00 11 comments

    The first three six who respond in the comments below will receive MI/O (including wristband, packaging and shipment) free of charge. The only condition is to write a small review here on hackaday.io. Of course it would be even cooler if you used MI/O in one of your projects.

    Update June 24, 2020: Will get the beta testing samples next week. After I have tested them, I will collect the addresses and send the samples.

    Update July 6, 2020: Beta testing samples ready for shipment...

    MI/O is manufactured at makerfabs, an Open Hardware, Arduino, Raspberry Pi, mbed, BeagleBone, IoT, Smart Home, etc, Related Products & Services Vendor for Makers and new Startups. They are very cooperative, communicative, take also care of smaller orders, work very clean and fast. A big thank you to the team.

  • On Sale

    M. Bindhammer05/22/2020 at 17:10 0 comments

    I am planning an Indiegogo campaign with MI/O. I've teamed up with makerfabs. They will assemble the wristwatch (100 pieces for now). Meanwhile I designed the packaging, a folding box 94 x 94 x 14 mm, 4-color print, glossy look, printed in Germany:

    First pictures from the pre-production, but still have questions about the left offset coin cell holder:

    Assembly of the OLED display during pre-production:


    After some emails back and forth and a call from my wife (she is Chinese) the coin cell holder is replaced by the original one. But overall makerfabs is doing a very good job so far, you can't say anything else.

    In the meantime I started the Indiegogo campaign. It is my first crowdfunding campaign ever and it took me some time to get along with Indiegogo. In the end, however, it is actually quite simple and you are guided step by step through the whole requirements. Most of the time I spent on all the graphics and the preparation of the pictures. I am running the campaign completely alone, there is no team, no CEO, CTO, co-founder, adviser and all that nonsense. I don't think the campaign will be a success, but I have learned a lot (even how to design a package) - that's the main thing.

  • Second prototype

    M. Bindhammer05/02/2020 at 22:27 0 comments

    After testing the first prototype a couple of days I decided to start working on a second prototype with some improvements. Biggest one: The I2C pullup resistors can now be disabled to prevent "phantom powering" of the connected devices. Means also I have to desolder the two pullup resistors on the OLED breakout before assembling it on the main board. Should provide a significant improvement of the running time when powered by a coin cell. The watch should now be operated for at least one week with a freshly charged LIR2032H coin cell. I have already discarded the idea to power the watch by a conventional 3V coin cell. The voltage is too close to the brownout detection threshold of 2.7V.

    Screenshot of the top. Two SOT-23 p-channel mosfets and a resistor added:

    Screenshot of the bottom. Some symbols added to be able to sell the board in Europe:

    As usual I used a stencil, low temperature melting soldering paste and a hot air gun to populate the board. Some soldering was done directly with a soldering iron. I am very satisfied with the result, looks like machine made:

    I replaced the normal female pin headers on the backside by 2.54mm machine pin female headers - single row, 1 x 8, round pin, H3.0, L7.4 - horizontal, SMT, as they have less mounting height respectively length and are more precise.

    Below you can see the discharge curve over time of a freshly charged LIR2032H coin cell. FEP (Functional End Point) is reached at 2.7V when BOD  (Brown-Out Detection) threshold is reached. Possibly further improvements can be achieved via software, for example putting the ATmega 328P into sleep mode (not done yet).

    Other than mentioned in the data sheet, it still seems possible to set the brownout detection threshold to 1.8V. To do this, proceed as follows.

    First we have to modify the boards.txt file. This file can be usually found in folder C:\Program Files (x86)\Arduino\hardware\arduino\avr. Open the boards.txt file, search for the section where the different Arduino Pro Mini boards/processors are defined and copy/paste the following block as a new definition of an Arduino Pro Mini into the section of the boards.txt file.

    ## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 BOD at 1.8V
    ## --------------------------------------------------
    pro.menu.cpu.8MHzatmega328bod1v8=ATmega328 (3.3V, 8 MHz, 1V8 BOD)
    
    pro.menu.cpu.8MHzatmega328bod1v8.upload.maximum_size=30720
    pro.menu.cpu.8MHzatmega328bod1v8.upload.maximum_data_size=2048
    pro.menu.cpu.8MHzatmega328bod1v8.upload.speed=57600
    
    pro.menu.cpu.8MHzatmega328bod1v8.bootloader.low_fuses=0xFF
    pro.menu.cpu.8MHzatmega328bod1v8.bootloader.high_fuses=0xDA
    pro.menu.cpu.8MHzatmega328bod1v8.bootloader.extended_fuses=0x06
    pro.menu.cpu.8MHzatmega328bod1v8.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex
    
    pro.menu.cpu.8MHzatmega328bod1v8.build.mcu=atmega328p
    pro.menu.cpu.8MHzatmega328bod1v8.build.f_cpu=8000000L

    Save the boards.txt file at the same location and close it.

    Re-start the Arduino IDE. Go to Tools. Choose Board: "Arduino Pro or Pro Mini", Processor: "ATmega328 (3.3V, 8 MHz, 1V8 BOD)" and  Programmer: "Arduino as ISP".

    To burn the bootloader and thus set the extended fuses from default 2.7V down to 1.8V, an Arduino Pro Mini (or clone) is required as a programmer and a 3.3V FTDI in addition to the MI/O board. These are wired as shown below:

    Once everything is connected (don't forget to set the switch on the MI/O board to external power supply) hit Burn Bootloader. This warning may appear:

    avrdude: WARNING: invalid value for unused bits in fuse "efuse", should be set to 1 according to datasheet
    This behaviour is deprecated and will result in an error in future version
    You probably want to use 0xFE instead of 0x06 (double check with your datasheet first).

     In this case open boards.txt file again and replace 0x06 with 0xFE at the appropriate position, save, restart Arduino IDE and repeat Burn Boatloader with the already mentioned...

    Read more »

  • Designing and building add-ons

    M. Bindhammer04/30/2020 at 16:07 0 comments

    1. USB power supply and a reading light

    USB power supply add-on gerber rendering:

    I added two additional solder pads (power isolation jumper) to enable the power indicator LED. Some may need it, some not.

    Reading light add-on gerber rendering:

    The LED (PLCC2 package) can be dimmed by PWM and controlled by the watch (e.g. switched on at 18:00 and switched off at 20:00).

    Populated and tested add-ons:

    The connectors are male headers, 8-pin, SMD, 2.54mm, right angle.

    Schematic:

    2. FM radio

    The FM radio is based on the receiver IC BK1079. The antenna signal is boosted in the analog part of the internal circuit by a highly sensitive amplifier (LNA, Low Noise Amplifier), whereas a regulated amplifier (PGA, Programmable Gain Amplifier) reduces the gain when the signal is too strong.  The Analog-to-Digital Converter (ADC) converts the signal into a sequence of numbers, which is then processed digitally. The processing is done by a digital signal processor. It filters and demodulates the frequency-modulated signal and filters the audio signal so that only the audio frequency range is provided. It also controls the Automatic Gain Control (AGC) to prevent overmodulation. The processed signal is sent to the Digital-to-Analog Converter (DAC), which converts it into an audio signal. The finished radio signal is then available at the analog output AOUT. The digital tuning  contains a microcontroller that controls the search and other functions. It uses a PLL (Phase Locked Loop) to precisely tune a high frequency oscillator that determines the receiving frequency. The PLL can be operated either digitally with a connected crystal (DPLL) or analog (APLL). An internal voltage regulator ensures a stable internal operating voltage even if the battery voltage is varying.

    The complete schematic of the FM radio add-on is shown below. The audio signal is amplified by the low power audio amplifier MC34119. Volume is adjusted via the potentiometer R5, the radio can be tuned via the two tactile switches SW1 and SW2. When the gate of the n-channel MOSFET Q1 is put to a HIGH state, the MOSFET pulls the PWD pin of U1 to GND, and the BK1079 goes into power down mode. When the BK1079 is active, an average DC voltage appears at the analogue output  (AOUT) together with the AF signal. This is used to switch the LED D1 on and to enable the amplifier U2 via the npn transistor Q2. In the power down state U1 switches this DC voltage off. The transistor Q2 turns off,  the LED too and the amplifier is driven into power down state via its chip-disable input.

    The SMD speaker is very small, just 11 x 15 x 3mm; I think it is used in smart phones. I put 4 holes around the land pattern of the speaker to have the possibility to mount a 3-D printed enclosure to improve the sound of the speaker if necessary.

    3-D model of the speaker enclosure. As a reference I used Best Practices for Designing Micro Speaker Enclosures.

    3-D printed speaker enclosure and speaker:

    Enclosure was printed by Shapeways, using Fine Detail Plastic setting.

    The standard 5 PCBs and custom cut stainless steel stencil from JLCPCB:

    USB power supply, watch and finished FM radio add-on in use. An antenna with a length of 20 cm delivers crystal-clear reception.

    3. Watering system for indoor plants

    Capacitive soil moisture sensor gerber rendering:

    The sensor has two electrodes that form a plate capacitor. The soil surrounding the capacitor serves as dielectric and influences its capacity - the more humid the soil, the greater the capacity of the capacitor. The capacitor, a resistor that charges the capacitor and 3 inverting Schmitt triggers (one stage just acts as a buffer) form a simple oscillator whose frequency depends on the capacity of the capacitor. The frequency is approximately in the range of 40 to 400kHz and can be measured via pulseIn()command and analyzed by the microcontroller.

    Populated PCB:

    Test code...
    Read more »

  • Programming the first prototype

    M. Bindhammer04/28/2020 at 15:49 0 comments

    After I reflowed the first board yesterday night, I started programming today. First I burned the bootloader onto the board to dublicate the settings of the Arduino Pro Mini (8MHz, 3.3V), wrote a test code (kinda annoying via ISP to develope code) and set the RTC to the date & time on my laptop. Then I uploaded the code again via ISP.

    Test code:

    #include "RTClib.h"
    #include <Arduino.h>
    #include <U8g2lib.h>
    #include <Wire.h>
    
    U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
    RTC_PCF8523 rtc;
    
    char daysOfTheWeek[7][12] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    int running_index = 0;
    
    void setup () {
      // Serial.begin(57600);
      pinMode(5, OUTPUT);
      digitalWrite(5, LOW); // Keep device switched on after PWR button was pressed
      u8g2.begin();
      rtc.begin();
      if (! rtc.initialized()) {
        // Serial.println("RTC is NOT running!");
        // following line sets the RTC to the date & time this sketch was compiled
        // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        // This line sets the RTC with an explicit date & time, for example to set
        // January 21, 2014 at 3am you would call:
        // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
      }
    }
    
    void loop () {
      DateTime now = rtc.now();  
      if(running_index < 2) {
        u8g2.clearBuffer();
        u8g2.setFont(u8g2_font_logisoso28_tr);
        u8g2.setCursor(0, 32);  // Seperate cursor position from print statement
        u8g2.print(now.hour());
        u8g2.print(":");
        if(now.minute() < 10) u8g2.print("0");
        u8g2.print(now.minute());
        u8g2.print(":");
        if(now.second() < 10) u8g2.print("0");
        u8g2.print(now.second());
        u8g2.sendBuffer();
      }
      if(running_index > 1 && running_index < 3) {
        u8g2.clearBuffer();
        u8g2.setFont(u8g2_font_logisoso22_tr);
        u8g2.setCursor(0, 32);  
        u8g2.print(daysOfTheWeek[now.dayOfTheWeek()]);
        u8g2.print(" ");
        u8g2.print(now.day());
        u8g2.print(".");
        if(now.month() < 10) u8g2.print("0");
        u8g2.print(now.month());
        u8g2.print(".");
        u8g2.sendBuffer();
      }
      delay(1000);
      running_index ++;
      if(running_index > 3) {
        u8g2.setPowerSave(1);
        pinMode(5, INPUT); // Switch device off
      }
    }

  • Boot time and BOD

    M. Bindhammer04/24/2020 at 15:01 0 comments

    The ATmega328P running on 8MHz needs a few seconds to boot after power is applied when using a bootloader. This is bad. The watch should show the time immediately after power-on. What to do? Using no bootloader at all on the watch's microcontroller! Programming the watch via ISP. Downside: need an Arduino Pro Mini or similar as a programmer and code upload is slow.

    Here is my experiment setup. Without bootloader time/date is nearly shown without delay after power-up:

    Seems also, according to the datasheet, the operating voltage for the ATmega328P is now only 2.7 to 5.5V, not starting at 1.8V anymore. The extended fuse can only be set to disable the BOD (0xFF), 2.7V (0xFD) or 4.3V (0xFC).

    Note, the extended fuse only uses the lower 3 bits. Unused fuse bits read back as 1.

    0xFE (110), before the setting for 1.8V, is now reserved. Let's see, if I disable the BOD. The 128 x 32 OLED  (I removed the voltage regulator on its breakout board) would still run at 2V. On the other hand, a watch should be a reliable device. Using BOD, the watch will execute brown-out resets when the battery voltage dips below the brownout threshold, typically 2.7V (min. 2.5V, max. 2.9V). This restarts the code, which restarts the display, causing another brown-out…repeating until the battery is dead. Without BOD the ATmega328P will start to behave erratically at some point, and may spontaneously jump to any random memory location. Also not good. Could be that the code become corrupted, means, we would need to re-flash the watch. Not good at all.

    I need to do some more testing. Finally, I also could use rechargeable LIR-2032 instead of CR2032. They have a rated voltage of 3.6V, lower capacity though (approx. 45mAh).

View all 6 project logs

Enjoy this project?

Share

Discussions

sevin wrote 10/23/2020 at 21:24 point

If you are still looking for testers, I would like to apply!

  Are you sure? yes | no

ahsanmohyuddin wrote 07/20/2020 at 12:33 point

Hi

By the looks of it, this project seems very interesting to me. I liked the hardware latching part and ad-ons part of your project very much. No other arduino based watch offers these, as far as i know.

I am willing to be a beta tester (and may add some features to software part of the watch after/during testing as well). I myself am trying to build some wristwatch but unfortunately i lack some resources. I hope you will consider me for beta testing of hardware and software.

  Are you sure? yes | no

M. Bindhammer wrote 07/20/2020 at 18:15 point

Replied you by PM

  Are you sure? yes | no

Andy wrote 05/03/2020 at 09:34 point

Nice project :).
I have one question regarding to PCB. Which kind of EDA system did you use for desiging. Especially 3D models creation.

Thanks 

  Are you sure? yes | no

M. Bindhammer wrote 05/03/2020 at 10:12 point

Upload your gerber to https://tracespace.io/view/

You can then download it as a svg file and render it further with inkscape. I imported most parts from fritzing. It's actually 2-D.

  Are you sure? yes | no

[deleted]

[this comment has been deleted]

M. Bindhammer wrote 05/01/2020 at 21:24 point

Thanks. Sorry to hear that about your sickness.

  Are you sure? yes | no

[deleted]

[this comment has been deleted]

M. Bindhammer wrote 04/29/2020 at 08:25 point

Yes. Use no bootloader.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates