Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 7 of 7

Thread: Serial port function on Teensy 3.1

  1. #1
    Senior Member onehorse's Avatar
    Join Date
    Apr 2014
    Location
    Danville, California
    Posts
    921

    Serial port function on Teensy 3.1

    I just got my first Teensy (3.1) and hooked it up to my current project--- a Nokia 5110 display showing sensor fused AHRS from a MPU-9150. The Teensy 3.1 replaces a 3.3 V 8 MHz Pro Mini. When I start the sketch, the display shows the header info but when I get to the first serial write it seems like the sketch stops, no further output of any kind. I verified I can get serial out using the blink program, and that I set the proper serial port (COM9) showing as the Teensy USB Serial port in the device manager, but I get nothing from the Arduini IDE serial monitor. Here is the first (functional) part of the sketch:

    #include <Wire.h>
    #include "I2Cdev.h"
    #include "MPU6050_9Axis_MotionApps41.h"
    #include <Adafruit_GFX.h>
    #include <Adafruit_PCD8544.h>

    // Using NOKIA 5110 monochrome 84 x 48 pixel display
    // pin 9 - Serial clock out (SCLK)
    // pin 8 - Serial data out (DIN)
    // pin 7 - Data/Command select (D/C)
    // pin 5 - LCD chip select (CS)
    // pin 6 - LCD reset (RST)
    Adafruit_PCD8544 display = Adafruit_PCD8544(9, 8, 7, 5, 6);

    // Declare device MPU6050 class
    MPU6050 mpu;

    // global constants for 9 DoF fusion and AHRS (Attitude and Heading Reference System)
    #define GyroMeasError PI * (60.0f / 180.0f) // gyroscope measurement error in rads/s (shown as 60 deg/s)
    #define GyroMeasDrift PI * (0.0f / 180.0f) // gyroscope measurement drift in rad/s/s (shown as 0.0 deg/s/s)
    // There is a tradeoff in the beta parameter between accuracy and response speed.
    // In the original Madgwick study, beta of 0.041 (corresponding to GyroMeasError of 2.7 degrees/s) was found to give optimal accuracy.
    // However, with this value, the LSM9SD0 response time is about 10 seconds to a stable initial quaternion.
    // Subsequent changes also require a longish lag time to a stable output, not fast enough for a quadcopter or robot car!
    // By increasing beta (GyroMeasError) by about a factor of fifteen, the response time constant is reduced to ~2 sec
    // I haven't noticed any reduction in solution accuracy. This is essentially the I coefficient in a PID control sense;
    // the bigger the feedback coefficient, the faster the solution converges, usually at the expense of accuracy.
    // In any case, this is the free parameter in the Madgwick filtering and fusion scheme.
    #define beta sqrt(3.0f / 4.0f) * GyroMeasError // compute beta
    #define zeta sqrt(3.0f / 4.0f) * GyroMeasDrift // compute zeta, the other free parameter in the Madgwick scheme usually set to a small or zero value
    #define Kp 2.0f * 5.0f // these are the free parameters in the Mahony filter and fusion scheme, Kp for proportional feedback, Ki for integral
    #define Ki 0.0f

    int16_t a1, a2, a3, g1, g2, g3, m1, m2, m3; // raw data arrays reading
    uint16_t count = 0; // used to control display output rate
    uint16_t delt_t = 0; // used to control display output rate
    uint16_t mcount = 0; // used to control display output rate
    uint8_t MagRate; // read rate for magnetometer data

    float pitch, yaw, roll;
    float deltat = 0.0f; // integration interval for both filter schemes
    uint16_t lastUpdate = 0; // used to calculate integration interval
    uint16_t now = 0; // used to calculate integration interval

    float ax, ay, az, gx, gy, gz, mx, my, mz; // variables to hold latest sensor data values
    float q[4] = {1.0f, 0.0f, 0.0f, 0.0f}; // vector to hold quaternion
    float eInt[3] = {0.0f, 0.0f, 0.0f}; // vector to hold integral error for Mahony method


    void setup()
    {
    Serial.begin(9600); // Start serial at 38400 bps

    display.begin(); // Initialize the display
    display.setContrast(58); // Set the contrast
    display.setRotation(0); // 0 or 2) width = width, 1 or 3) width = height, swapped etc.

    // Start device display with ID of sensor
    display.clearDisplay();
    display.setTextSize(2);
    display.setCursor(0,0); display.print("MPU9150");
    display.setTextSize(1);
    display.setCursor(0, 20); display.print("9 DOF sensor");
    display.setCursor(0, 30); display.print("data fusion");
    display.setCursor(20, 40); display.print("AHRS");
    display.display();
    delay(2000);

    // Set up for data display
    display.setTextSize(1); // Set text size to normal, 2 is twice normal etc.
    display.setTextColor(BLACK); // Set pixel color; 1 on the monochrome screen
    display.clearDisplay(); // clears the screen and buffer
    display.display();


    // initialize MPU6050 device
    Serial.println(F("Initializing I2C devices..."));
    delay(1000);

    I see the Nokia display but do not see the first Serial print. I'm not sure it should matter but do I have to define SDA and SCL as A4 and A5 for I2C? I hope there is something obvious I am overlooking. Thanks for any help!
    mpu.initialize();

  2. #2
    Senior Member+ MichaelMeissner's Avatar
    Join Date
    Nov 2012
    Location
    Ayer Massachussetts
    Posts
    3,887
    Note when posting code, it should be inside '[' code ']' and '[' /code ']' blocks. Or go to the advanced menu and hit the '#' option in the 2nd button row.

    To use i2c on the Teensy 3.1, you need to supply 4.7K ohm pull-up resistors for both SDA/SCL (A4/A5).

    Are you hooking up pins 0/1 to the FTDI chip like you would for the Pro Mini? If that is the case, you need to use Serial1 instead of Serial. On the Teensy 3.x, Serial only refers to the USB port, and Serial1 refers to the first hardware serial port (there are 3 hardware serial ports in the Teensy). If you want to use the USB serial port and not bother with hooking up the FTDI chip, after the program starts hit the magnifying glass in the IDE to bring up the serial monitor. Note, the serial port is recreated each time the Teensy reboots. Typically I put a delay of a second or 2 in the begin() function, so I don't miss messages. I don't think a standard serial connection is created, but a private connection is used.

  3. #3
    Senior Member onehorse's Avatar
    Join Date
    Apr 2014
    Location
    Danville, California
    Posts
    921
    Thanks for the reply Michael!

    I'm pretty sure the MPU-9150 breakout board I am using has pull up resistors on SDA and SCL. I am not using an FTDI chip or hardware serial. I am using the USB serial port that seems to work fine in the simplle blink and RTC sketches. I'll try a longer delay before the first write. I suspect the real problem is I am not talking to the MPU-9150.

  4. #4
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    23,075
    Quote Originally Posted by onehorse View Post
    I see the Nokia display but do not see the first Serial print.
    Try adding this at the beginning of setup()

    Code:
      while (!Serial) ; // wait for serial monitor window to open
    You might also try the MPU60X0 library from FreeIMU. It's been tested (with the MPU6050) and is known to work on Teensy 3.x

    https://github.com/PaulStoffregen/Fr...ster/libraries

  5. #5
    Senior Member Jp3141's Avatar
    Join Date
    Nov 2012
    Posts
    486
    See this http://forum.pjrc.com/threads/25590-...5831#post45831 for confirming that you have a working I2C device.

    Code:
    for (int address=1; address <= 126; address++) {
        Wire.beginTransmission(address); // Select address
        if (!Wire.endTransmission(true)) Serial.printf("Found device at: %02Xh\n", address);
       }

  6. #6
    Senior Member PaulStoffregen's Avatar
    Join Date
    Nov 2012
    Posts
    23,075
    Also, on the serial monitor, check your Tools > Serial Port setting.

    On Teensy, the serial port setting is NOT used for upload. It only applies to the serial monitor. With a regular Arduino, you can't upload if the serial port setting is wrong. With Arduino, after a successful upload, you don't need to worry about the serial port setting. But with Teensy, the upload works regardless of the serial port setting, and the serial port doesn't even appear in the menu until Teensy is running your code (and becomes whatever USB device you set in Tools > USB Type).

    If the serial port is set to your Arduino Mini or some other thing, it's possible Teensy is trying to send you info, simply on a different port.

  7. #7
    Senior Member onehorse's Avatar
    Join Date
    Apr 2014
    Location
    Danville, California
    Posts
    921
    Thanks everyone for your kind help. The serial wait allowed me to verify that I successfully got serial commo from the Teensy 3.1. As I suspected, it balked at the MPU-9150 initialize step. I inserted this :

    /CODE


    // initialize MPU6050 device
    Serial.println("Initializing I2C devices...");
    delay(1000);

    for (int address=1; address <= 126; address++) {
    Wire.beginTransmission(address); // Select address
    if (!Wire.endTransmission(true)) {
    Serial.printf("Found device at: %02Xh\n", address); }
    else {
    Serial.printf("Found no devices!"); }
    }

    mpu.initialize();


    /CODE

    and got nothing else but the "Initializing I2C devices..." message.

    This library (Jeff Rowberg's) relies on a combination of Wire.h and I2Cdev.h. I suspect the problem is with the latter.

    I was able to successfully run a sketch to get output from a LSM9DS0 sensor using the Teensy 3.1 using a very similar sketch that solely uses Wire.h for the I2C commo. Yet another sketch uses a bare bones I2C.h library that won't even compile on the Teensy but runs happily on the Pro Mini.

    I need to chnage these libraries. Would you recommend converting all to Wire.h or to the modified I2C.h library I ran across at the forum main page? Thank again for your help!

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •