Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Hardware
  3. Mysensor-ing a thermostatic valve

Mysensor-ing a thermostatic valve

Scheduled Pinned Locked Moved Hardware
17 Posts 5 Posters 8.1k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    Sorg
    wrote on last edited by Sorg
    #5

    That's right. I don't need the bootloader itself.

    edit:
    This a memo for myself :
    http://www.instructables.com/id/Arduino-on-all-sorts-of-Atmels/?ALLSTEPS
    Atmega3290 is supported and is pretty close of atmega 329.

    1 Reply Last reply
    0
    • S Offline
      S Offline
      Sorg
      wrote on last edited by
      #6

      Hey guys,
      Some news,

      I have received 2 HR25 TRV.
      I have tried to connect an ISP header to one of them.
      The good news is: MISO/MOSI/SCK/GND/VCC./and RESET are easily available on the upper part of the PCB. (SPI pins are used for the 3 buttons and power and reset are already available on the Jtag header.
      The bad news is that it is quite easy to damge the pcb while welding. I have had a problem with two coppers traces that went away of the PCB... probably because of overheat. Theses traces were so thin, that until now i hav not been able to weld a jumper to repair them.
      However , i will try again tonight.

      Regarding the software, i think i have been able to set-up the arduino IDE to compile for an atmega329p target. I have to test it to validate the process.

      1 Reply Last reply
      0
      • S Offline
        S Offline
        Sorg
        wrote on last edited by Sorg
        #7

        Hi there,

        I have been able to make some progress.
        The cutted traces have been repaired with some thin wire. However, this board is definitely damaged. I think this one will remain my "guinea pig".

        after repairing the traces, i have tested the isp connection:

        sorg@samsung-ubuntu:~$ avrdude -c usbasp -p m329p
           
        avrdude: warning: cannot set sck period. please check for usbasp firmware update.   
        avrdude: AVR device initialized and ready to accept instructions
          
        Reading | ################################################## | 100% 0.00s
        avrdude: Device signature = 0x1e950b
        avrdude: safemode: Fuses OK (E:FD, H:91, L:62)
        avrdude done.  Thank you.
        

        :heart_eyes:

        No it's time to set-up the arduino IDE for compiling...

        in my Arduino/hardware/boards.txt, i have hadded the following lines:
        ##############################################################

        hr25.name=HoneyWell HR25 Thermostat/ programming with USBasp
        hr25.upload.using=USBasp
        hr25.upload.protocol=usb
        hr25.upload.maximum_size=30720
        hr25.upload.speed=38400
        
        hr25.build.mcu=atmega329p
        hr25.build.f_cpu=16000000L
        hr25.build.core=arduino
        hr25.build.variant=hr25
        

        Then, i have created a new folder named "hr25" in Arduino/hardware/variants , and in this folder i create a file named pins_arduino.h and put the following inside:

        /*
          pins_arduino.h - Pin definition functions for Arduino
          Part of Arduino - http://www.arduino.cc/
        
          Copyright (c) 2007 David A. Mellis
        
          This library is free software; you can redistribute it and/or
          modify it under the terms of the GNU Lesser General Public
          License as published by the Free Software Foundation; either
          version 2.1 of the License, or (at your option) any later version.
        
          This library is distributed in the hope that it will be useful,
          but WITHOUT ANY WARRANTY; without even the implied warranty of
          MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
          Lesser General Public License for more details.
        
          You should have received a copy of the GNU Lesser General
          Public License along with this library; if not, write to the
          Free Software Foundation, Inc., 59 Temple Place, Suite 330,
          Boston, MA  02111-1307  USA
        
          ***************************************
          Definition for ATmega329p as in the HR25 thermostat
        */
        
        #ifndef Pins_Arduino_h
        #define Pins_Arduino_h
        
        #include <avr/pgmspace.h>
        
        #define NUM_DIGITAL_PINS            53
        #define NUM_ANALOG_INPUTS           8
        #define analogInputToDigitalPin(p)  ((p < 8) ? (p) + 40 : -1)
        #define digitalPinHasPWM(p)         ((p) == 12 || (p) == 14 || (p) == 15 || (p) == 13)
        
        
        static const uint8_t SS   = 8; 		//PB0
        static const uint8_t MOSI = 10;		//PB2
        static const uint8_t MISO = 11;		//PB3
        static const uint8_t SCK  = 9;		//PB1
        
        static const uint8_t SDA = 37;		//PE5
        static const uint8_t SCL = 36;		//PE4
        // #define LED_BUILTIN 13
        
        static const uint8_t A0 = 40;		//PF0
        static const uint8_t A1 = 41;		//PF1
        static const uint8_t A2 = 42;		//PF2
        static const uint8_t A3 = 43;		//PF3
        static const uint8_t A4 = 44;		//PF4
        static const uint8_t A5 = 45;		//PF5
        static const uint8_t A6 = 46;		//PF6
        static const uint8_t A7 = 47;		//PF7
        
        // Not sure of that... atmega168 use PCICR whereas the atmegaxx9 seems to use a EIMSK register... Will it work ?
        #define digitalPinToPCICR(p)    ( (((p) >= 32) && ((p) <= 39)) ||  (((p) >= 8) && ((p) <= 15)) ? (&EIMSK) : \
        								((uint8_t *)0) ) )
        								
        #define digitalPinToPCICRbit(p) ( (((p) >= 32) && ((p) <= 39)) ? 4 : \
        								( (((p) >= 8) && ((p) <= 15)) ? 5 : \
        								((uint8_t *)0) ) )
        								
        #define digitalPinToPCMSK(p)    ( (((p) >= 32) && ((p) <= 39)) ? (&PCMSK0) : \
        								( (((p) >= 8) && ((p) <= 15)) ? (&PCMSK1) : \
        								((uint8_t *)0) ) )
        								
        #define digitalPinToPCMSKbit(p) ( (((p) >= 32) && ((p) <= 39)) ? ((p) - 32) : \
        								( (((p) >= 8) && ((p) <= 15)) ? ((p) - 8) : \
        								((uint8_t *)0) ) )
        								
        #define digitalPinToInterrupt(p)  ((p) == 24 ? 0 : NOT_AN_INTERRUPT)
        
        #ifdef ARDUINO_MAIN
        
        // these arrays map port names (e.g. port B) to the
        // appropriate addresses for various functions (e.g. reading
        // and writing)
        const uint16_t PROGMEM port_to_mode_PGM[] = {
        	NOT_A_PORT,
        	(uint16_t) &DDRA,
        	(uint16_t) &DDRB,
        	(uint16_t) &DDRC,
        	(uint16_t) &DDRD,
        	(uint16_t) &DDRE,
        	(uint16_t) &DDRF,
        	(uint16_t) &DDRG,
        };
        
        const uint16_t PROGMEM port_to_output_PGM[] = {
        	NOT_A_PORT,
        	(uint16_t) &PORTA,
        	(uint16_t) &PORTB,
        	(uint16_t) &PORTC,
        	(uint16_t) &PORTD,
        	(uint16_t) &PORTE,
        	(uint16_t) &PORTF,
        	(uint16_t) &PORTG,
        };
        
        const uint16_t PROGMEM port_to_input_PGM[] = {
        	NOT_A_PORT,
        	(uint16_t) &PINA,
        	(uint16_t) &PINB,
        	(uint16_t) &PINC,
        	(uint16_t) &PIND,
        	(uint16_t) &PINE,
        	(uint16_t) &PINF,
        	(uint16_t) &PING,
        };
        
        const uint8_t PROGMEM digital_pin_to_port_PGM[] = {
        	PA,	 // 0					// LCD_Com0
        	PA,							// LCD_Com1
        	PA,							// LCD_Com2
        	PA,
        	PA,							// LCD_Seg0
        	PA,							// LCD_Seg1
        	PA,							// LCD_Seg2
        	PA,							// LCD_Seg3
        
        	PB,	 // 8 - NSS - PCINT8	// Contact - Thermostat installed on the valve
        	PB,  // 9 - SCK - PCINT9	// KEY °C
        	PB,  // 10 - MOSI - PCINT10	// KEY Prog
        	PB,  // 11 - MISO - PCINT11	// KEY Auto/Manu
        	PB,  // 12 - PWM - PCINT12	// H-Bridge 1
        	PB,  // 13 - PWM - PCINT13	// Incremental coder A
        	PB,  // 14 - PWM - PCINT14	// Incremental coder B
        	PB,  // 15 - PWM - PCINT15	// H-Bridge 2
        	
        	PC,	 // 16					// LCD_Seg12
        	PC,	 // 17					// LCD_Seg11
        	PC,	 // 18					// LCD_Seg10
        	PC,	 // 19					// LCD_Seg9
        	PC,	 // 20					// LCD_Seg8
        	PC,	 // 21					// LCD_Seg7
        	PC,	 // 22					// LCD_Seg6
        	PC,	 // 23					// LCD_Seg5
        
        	PD,  // 24 - INT0
        	PD,	 // 25					// LCD_Seg21
        	PD,	 // 26					// LCD_Seg20
        	PD,	 // 27					// LCD_Seg19
        	PD,	 // 28					// LCD_Seg18
        	PD,	 // 29					// LCD_Seg17
        	PD,	 // 30					// LCD_Seg16
        	PD,	 // 31					// LCD_Seg15
        
        	PE,	 // 32 - RXD - PCINT0	// Header Pin7
        	PE,	 // 33 - TXD - PCINT1	// Header Pin6
        	PE,	 // 34 - PCINT2			// Header Pin2
        	PE,	 // 35 - PCINT3			// Activate reflective sensor
        	PE,	 // 36 - SCL - PCINT4	// Reflective sensor output
        	PE,	 // 37 - SDA - PCINT5
        	PE,	 // 38 - PCINT6
        	PE,	 // 39 - PCINT7
        
        	PF,	 // 40 - A0
        	PF,	 // 41 - A1
        	PF,	 // 42 - A2				// NTC measurement.
        	PF,	 // 43 - A3				// Activate NTC divider bridge
        	PF,	 // 44 - A4 - TCK		// Header Pin4
        	PF,	 // 45 - A5 - TMS		// Header Pin3
        	PF,	 // 46 - A6 - TDO		// Header Pin5
        	PF,	 // 47 - A7 - TDI		// Header Pin8
        	
        	PG,	 // 48					// LCD_Seg14
        	PG,	 // 49					// LCD_Seg13
        	PG,							// LCD_Seg4
        	PG,							// H-Bridge 3
        	PG,  // 52 					// H-Bridge 4
        	NOT_A_PORT,
        	NOT_A_PORT,
        	NOT_A_PORT,
        };
        
        const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = {
        	_BV(0), /* 0, port A */
        	_BV(1),
        	_BV(2),
        	_BV(3),
        	_BV(4),
        	_BV(5),
        	_BV(6),
        	_BV(7),
        
        	_BV(0), /* 8, port B */
        	_BV(1),
        	_BV(2),
        	_BV(3),
        	_BV(4),
        	_BV(5),
        	_BV(6),
        	_BV(7),
        
        	_BV(0), /* 16, port C */
        	_BV(1),
        	_BV(2),
        	_BV(3),
        	_BV(4),
        	_BV(5),
        	_BV(6),
        	_BV(7),
        
        	_BV(0), /* 24, port D */
        	_BV(1),
        	_BV(2),
        	_BV(3),
        	_BV(4),
        	_BV(5),
        	_BV(6),
        	_BV(7),
        
        	_BV(0), /* 32, port E */
        	_BV(1),
        	_BV(2),
        	_BV(3),
        	_BV(4),
        	_BV(5),
        	_BV(6),
        	_BV(7),
        
        	_BV(0), /* 40, port F */
        	_BV(1),
        	_BV(2),
        	_BV(3),
        	_BV(4),
        	_BV(5),
        	_BV(6),
        	_BV(7),
        
        	_BV(0), /* 48, port G */
        	_BV(1),
        	_BV(2),
        	_BV(3),
        	_BV(4),
        	NOT_A_PIN,
        	NOT_A_PIN,
        	NOT_A_PIN,
        };
        
        const uint8_t PROGMEM digital_pin_to_timer_PGM[] = {
        	NOT_ON_TIMER, 	/* 0  - PA0 */
        	NOT_ON_TIMER, 	/* 1  - PA1 */
        	NOT_ON_TIMER, 	/* 2  - PA2 */
        	NOT_ON_TIMER,  	/* 3  - PA3 */
        	NOT_ON_TIMER,	/* 4  - PA4 */
        	NOT_ON_TIMER, 	/* 5  - PA5 */
        	NOT_ON_TIMER, 	/* 6  - PA6 */
        	NOT_ON_TIMER,	/* 7  - PA7 */
        	
        	NOT_ON_TIMER, 	/* 8  - PB0 */
        	NOT_ON_TIMER, 	/* 9  - PB1 */
        	NOT_ON_TIMER, 	/* 10 - PB2 */
        	NOT_ON_TIMER, 	/* 11 - PB3 */
        	TIMER0A,	  	/* 12 - PB4 */
        	TIMER1A,	 	/* 13 - PB5 */
        	TIMER1B,	 	/* 14 - PB6 */
        	TIMER2A,	 	/* 15 - PB7 */
        	
        	NOT_ON_TIMER, 	/* 16 - PC0 */
        	NOT_ON_TIMER,	/* 17 - PC1 */
        	NOT_ON_TIMER,	/* 18 - PC2 */
        	NOT_ON_TIMER,	/* 19 - PC3 */
        	NOT_ON_TIMER,	/* 20 - PC4 */
        	NOT_ON_TIMER,	/* 21 - PC5 */
        	NOT_ON_TIMER,	/* 22 - PC6 */
        	NOT_ON_TIMER,	/* 23 - PC7 */
        	
        	NOT_ON_TIMER,	/* 24 - PD0 */
        	NOT_ON_TIMER,	/* 25 - PD1 */
        	NOT_ON_TIMER,	/* 26 - PD2 */
        	NOT_ON_TIMER,	/* 27 - PD3 */
        	NOT_ON_TIMER,	/* 28 - PD4 */
        	NOT_ON_TIMER,	/* 29 - PD5 */
        	NOT_ON_TIMER,	/* 30 - PD6 */
        	NOT_ON_TIMER,	/* 31 - PD7 */
        	
        	NOT_ON_TIMER,	/* 32 - PE0 */
        	NOT_ON_TIMER,	/* 33 - PE1 */
        	NOT_ON_TIMER,	/* 34 - PE2 */
        	NOT_ON_TIMER,	/* 35 - PE3 */
        	NOT_ON_TIMER,	/* 36 - PE4 */
        	NOT_ON_TIMER,	/* 37 - PE5 */
        	NOT_ON_TIMER,	/* 38 - PE6 */
        	NOT_ON_TIMER,	/* 39 - PE7 */
        	
        	NOT_ON_TIMER,	/* 40 - PF0 */
        	NOT_ON_TIMER,	/* 41 - PF1 */
        	NOT_ON_TIMER,	/* 42 - PF2 */
        	NOT_ON_TIMER,	/* 43 - PF3 */
        	NOT_ON_TIMER,	/* 44 - PF4 */
        	NOT_ON_TIMER,	/* 45 - PF5 */
        	NOT_ON_TIMER,	/* 46 - PF6 */
        	NOT_ON_TIMER,	/* 47 - PF7 */
        	
        	NOT_ON_TIMER,	/* 48 - PG0 */
        	NOT_ON_TIMER,	/* 49 - PG1 */
        	NOT_ON_TIMER,	/* 50 - PG2 */
        	NOT_ON_TIMER,	/* 51 - PG3 */
        	NOT_ON_TIMER,	/* 52 - PG4 */
        	NOT_ON_TIMER,	/* 53 - PG5 dose not exist*/
        	NOT_ON_TIMER,	/* 54 - PG6 dose not exist*/
        	NOT_ON_TIMER	/* 55 - PG7 dose not exist*/
        };
        
        #endif
        
        // These serial port names are intended to allow libraries and architecture-neutral
        // sketches to automatically default to the correct port name for a particular type
        // of use.  For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN,
        // the first hardware serial port whose RX/TX pins are not dedicated to another use.
        //
        // SERIAL_PORT_MONITOR        Port which normally prints to the Arduino Serial Monitor
        //
        // SERIAL_PORT_USBVIRTUAL     Port which is USB virtual serial
        //
        // SERIAL_PORT_LINUXBRIDGE    Port which connects to a Linux system via Bridge library
        //
        // SERIAL_PORT_HARDWARE       Hardware serial port, physical RX & TX pins.
        //
        // SERIAL_PORT_HARDWARE_OPEN  Hardware serial ports which are open for use.  Their RX & TX
        //                            pins are NOT connected to anything by default.
        #define SERIAL_PORT_MONITOR   Serial
        #define SERIAL_PORT_HARDWARE  Serial
        
        #endif
        

        DISCLAIMER: The previous file has been created by myself by mixing several sources.I am notan arduino nor AVR expert, and I do not guarantee that everything is correct. Specificaly, i have some doubt about the pin change interupts... to be tested and improved.

        So once this file has been created, i can start arduino and create a simple "blink" sketch.

        /*
          Blink
          Turns on an LED on for one second, then off for one second, repeatedly.
        
          This example code is in the public domain.
         */
        
        int led = 34; // pin 34 = PE2, a pin exposed on the connector of the TRV.
        
        // the setup routine runs once when you press reset:
        void setup() {                
          // initialize the digital pin as an output.
          pinMode(led, OUTPUT);     
        }
        
        // the loop routine runs over and over again forever:
        void loop() {
          digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
          delay(1000);               // wait for a second
          digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
          delay(1000);               // wait for a second
        }
        

        Menu Tool / Card Type, i select the HR25 entry. Then, i select file/ upload with programmer and voila !
        The sketch compile and is loaded through the isp pins.
        Then i can see the PE2 pin blinking... Howeer, the frequecy is not correct . Instead of blinking every 1s I have a blink every 8seconds... i guess i have a problem of frequency scaling.... to be investigated but it's a good start !

        1 Reply Last reply
        1
        • S Offline
          S Offline
          Sorg
          wrote on last edited by
          #8

          The fuses of th HR25 atmega are:

          E:FD, H:91, L:62

          If i trust the AVR duse calc: http://www.engbedded.com/fusecalc/
          This means that the 8-divider is applied on the clock... this might explain the behavious seen above.

          So i changed the CKDIV8 bit:

          avrdude -c usbasp -p m329p -U lfuse:w:0xe2:m
          

          and voila the pin 34 , blink à 1Hz.
          Frequency problem solved.

          1 Reply Last reply
          0
          • S Offline
            S Offline
            Sorg
            wrote on last edited by
            #9

            OK, some news....
            I have connected a rf24 module to the external header, hoping to drive it with softSPI (in order to limit internal modification of the valve).

            While compiling a simple mysensor sketch, i can see several issues with the libraries Lowpower.h and PinchangeInt.h.... these libraries are very MCU-dependant and are not compiling. It is probably doable to modify them in order to upport the 329p, but it is out of my field of competence. I don't really understand the internals of theses libs.
            If someone can help, it will be apreciated.

            1 Reply Last reply
            0
            • hekH Offline
              hekH Offline
              hek
              Admin
              wrote on last edited by
              #10

              These dependencies has been removed in the development branch.

              S 1 Reply Last reply
              0
              • hekH hek

                These dependencies has been removed in the development branch.

                S Offline
                S Offline
                Sorg
                wrote on last edited by
                #11

                @hek said:

                These dependencies has been removed in the development branch.

                Is that sure ? I have not tried to compile dev branch yet, but i still find a reference to lowpower in Mysensor.h :

                #ifdef __cplusplus
                #include <Arduino.h>
                #include <SPI.h>
                #include "utility/LowPower.h"
                #endif
                
                hekH 1 Reply Last reply
                0
                • S Sorg

                  @hek said:

                  These dependencies has been removed in the development branch.

                  Is that sure ? I have not tried to compile dev branch yet, but i still find a reference to lowpower in Mysensor.h :

                  #ifdef __cplusplus
                  #include <Arduino.h>
                  #include <SPI.h>
                  #include "utility/LowPower.h"
                  #endif
                  
                  hekH Offline
                  hekH Offline
                  hek
                  Admin
                  wrote on last edited by hek
                  #12

                  @Sorg

                  Sorry.. I only read PinChangeInt. Still a Lowpower dependecy if you want to use the sleep functions.

                  Might be good to make this as a "driver" as well in the future. But it will be hard because it is relatively hardware dependent if you want to wake up on external triggers.

                  S 1 Reply Last reply
                  0
                  • hekH hek

                    @Sorg

                    Sorry.. I only read PinChangeInt. Still a Lowpower dependecy if you want to use the sleep functions.

                    Might be good to make this as a "driver" as well in the future. But it will be hard because it is relatively hardware dependent if you want to wake up on external triggers.

                    S Offline
                    S Offline
                    Sorg
                    wrote on last edited by
                    #13

                    @hek Sure.
                    Modifying the lowpower library to manage the 329p is definitely doable but i need to understand the internals and read the MCU datasheet. Time consuming but doable.

                    1 Reply Last reply
                    0
                    • S Offline
                      S Offline
                      Sorg
                      wrote on last edited by
                      #14

                      Other general question:
                      At this stage, is the "dev" branch compatible with a "stable" gateway and "stable" nodes ?

                      Luc3asL 1 Reply Last reply
                      0
                      • hekH Offline
                        hekH Offline
                        hek
                        Admin
                        wrote on last edited by
                        #15

                        Yes, it should.

                        1 Reply Last reply
                        0
                        • S Sorg

                          Other general question:
                          At this stage, is the "dev" branch compatible with a "stable" gateway and "stable" nodes ?

                          Luc3asL Offline
                          Luc3asL Offline
                          Luc3as
                          wrote on last edited by
                          #16

                          @Sorg Hello, I am really interested in this topic, do you have any new informations or progress in this project ?

                          1 Reply Last reply
                          0
                          • S Offline
                            S Offline
                            Sorg
                            wrote on last edited by
                            #17

                            Hello Lucas,

                            Last year , i did not achieve to run a sketch on the HR25. I remain convinced that it should be doable, but i am not enough aware of the inner details of the MCU / Arduino.
                            also, my job has become a lot more time consuming, and i have not been able to spend time on this project for several months.

                            If someone want to take over from here, i would be very happy.

                            1 Reply Last reply
                            0
                            Reply
                            • Reply as topic
                            Log in to reply
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes


                            17

                            Online

                            11.7k

                            Users

                            11.2k

                            Topics

                            113.0k

                            Posts


                            Copyright 2019 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                            • Login

                            • Don't have an account? Register

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • MySensors
                            • OpenHardware.io
                            • Categories
                            • Recent
                            • Tags
                            • Popular