Software installation
Software installation
Software installation to maintain the REGBOT code on the Teensy3.1 platform.
The description is tested on Ubuntu Linux 32bit and 64bit - version 14.04 (Long Time Stable (LTS) version)
Toolchain installation
Install (unpack) arduino 1.06 from
http://arduino.cc/en/Main/OldSoftwareReleases
(newer arduino versions is not supported - as of September 2014)
Then get and install the teensey tool installer from:
https://www.pjrc.com/teensy/td_download.html
Run the installer - on 32 bit linux it is:
chmod +x teensyduino.32bit ./teensyduino.32bit
It installes (only) as a merge with the arduino installed directory (arduino-1.0.6).
From this installation we need only some hardware parts in
arduino-1.0.6/hardware/tools arduino-1.0.6/hardware/teensy/cores/teensy3
The path to the compiler was earlier in arduino-1.0.6/hardware/tools/arm-none-eabi/bin this is now changed to arduino-1.0.6/hardware/tools/arm/bin, and the COMPILERPATH in the Makefile may need a change to the new path.
ADC using interrupt
Get the ADC (Analogue to Digital Converter) module that supports interrupt with teensy 3.1
Download from https://github.com/pedvide/ADC
git clone https://github.com/pedvide/ADC
From the ADC directory copy the *.cpp and *.h files to arduino-1.0.6/hardware/teensy/cores/teensy3
cd ADC cp *.cpp *.h ~/arduino-1.0.6/hardware/teensy/cores/teensy3
That will add these files to the other teensy3 library files:
ADC.cpp ADC.h ADC_Module.cpp ADC_Module.h RingBuffer.cpp RingBuffer.h RingBufferDMA.cpp RingBufferDMA.h
Teensy loader and udev rules
Teensy loader: Get the loader - and udev rules - from
https://www.pjrc.com/teensy/loader.html
The teensy loader needs to be unpacked - on linux it is:
gunzip teensy.gz chmod +x teensy
For Linux get also the udev rules, and copy them to /etc/udev/rules.d to get read-write access to the usb connection (/dev/ttyACM0) and others:
sudo cp 49-teensy.rules /etc/udev/rules.d/
Teensy 3.1 memory issues
The teensy 3.1 using MK20DX256 32 processor from Freescale. It has 64kB of RAM, but it is divided into 2 x 32kByte.
0x20007fff top of RAM <- stack starts here 32kB Upper part of memory <- Heap starts just after static variable allocation 0x20000000 | 0x1fffffff | REGBOT uses about 45kB of static allocated RAM | 32kB Lower part of memory | 0x1fff8000 Start of RAM <- static variables allocated from here
A variable placed in memory overlapping the boundary between upper and lower memory is not allowed - se test on this page: http://eleccelerator.com/kinetis-microcontroller-sram-region-hard-faults/
In case of REGBOT, about 35kB of static memory is allocated for data logging, this means that this memory overlaps the boundary at 0x20000000.
This is handled when data is added or retrieved from the log, the chunk of data overlapping the boundary is left unused. The result is that one less line of logged data is available, but there is no gap in the data stream.
Heap space is used by some libraries, and usually no more then 1.5kB is allocated as heap space. this leaves about 17kB as stack space. It is not tested how much of this is used.
Regbot software
Then get the regbot software (from SVN repository on previous page)
It consist of a series of directories but is missing the tools and teensy3 directories,
Copy (or link) the arduino-1.0.6/hardware/tools, arduino-1.0.6/libraries/Snooze and arduino-1.0.6/hardware/teensy/cores/teensy3 directory to the regbot directory, or set the TOOLSPATH and COREPATH in the regbot Makefile.
Links: go into the regbot directory with the source
cd regbot ln -s ~/arduino-1.0.6/hardware/tools . ln -s ~/arduino-1.0.6/hardware/teensy/cores/teensy3 . ln -s ~/arduino-1.0.6/libraries/Snooze . ln -s tools/teensy .
The last link is only for convenience to start the teensy loader application.
Compile REGBOT
Compile the source
make
Common errors
* millies()
If you get
$ make [CXX] src/baro180.cpp [CXX] src/data_logger.cpp [CXX] src/i2c_t3.cpp [CXX] src/main.cpp [CXX] src/mission.cpp [CXX] src/motor_controller.cpp [CXX] src/mpu9150.cpp [CXX] src/rbuf.cpp [CXX] src/robot.cpp In file included from src/main.h:31:0, from src/robot.cpp:29: ./teensy3/usb_serial.h: In member function 'size_t usb_serial_class::readBytes(char*, size_t)': ./teensy3/usb_serial.h:97:38: error: 'millis' was not declared in this scope unsigned long startMillis = millis();
The millis() function is defined in core_pins.h, so I added this into:
nano -w ./teensy3/usb_serial.h // line 34 35 (in version 1.24) #include <usb_desc.h> #include <core_pins.h> // <= added include line
* multiple main
You probably get:
make ... .../regbot/teensy3/main.cpp:4: multiple definition of `main' .../regbot/build/src/main.o:/.../regbot/src/main.cpp:434: first defined here collect2: error: ld returned 1 exit status make: *** [regbot.elf] Fejl 1
Then rename the teensy3 main file from the compile set
mv teensy3/main.cpp teensy3/main.cpp.not_used
Upload to REGBOT
Using the teensy loader, point it to the regbot.hex file and upload.
./teensy
Python packages
Additional python packages used to show some graphs
- python-pyqtgraph
- python-qt4-gl
- python-scipy
* no python-pyqtgraph
On my 14.04 32 bit ubuntu the python-pyqtgraph package was not found using apt-get, so I
downloaded from http://www.pyqtgraph.org/ the debian package python-pyqtgraph_0.9.10-1_all.deb and installed using:
sudo dpkg -i python-pyqtgraph_0.9.10-1_all.deb