Вопрос о Teensy 4.1

  Друзья, прошу помощи с контроллером Teensy 4.1

Очень мало информации о нем в русскоязычном сегменте интернета.
Проблемы с которыми я к вам пришел:

  1. Соответствие физических пинов на плате и пинов в среде arduini IDE ? Внятной информации нет, На схемах много путаницы, одни и те же пины подписаны по несколько раз и определить что и чему соответствует не получается, помогите пожалуйста .
  2. На Teensy 4.1 есть свой разъем SD card. Я не понимаю какую библиотеку использовать, чтобы мой скетч пользовался именно этим разъемом, в самой библиотеке , как я понимаю, предусмотрено общение с внешним модулем SD card, там прописаны пины к которым внешний модуль необходимо подпаять, а каким образом в скетче прописать использование родного слота я не понял, Вот основные проблемы которые мне не понятны, Спасибо за внимание, надеюсь на вашу помощь.

а зачем ты ее тогда покупал?

дело в том, что я делаю гирлянду на окно, Первая модель размерами 16х17 пикселей отлично работала и на nodemcu, но теперь я собрал матрицу 31х33 пикселя (WS2812) и контроллер на nodemcu с таким количеством пикселей не справляется, Предвижу ваш совет о покупке Т1000 или подобных готовых изделий из китая - купил, он вполне себе справляется, но софт, который используется с этими китайконтроллерами способен погубить самую устойчивую психику, создавать на нем эффекты для гирлянды просто невозможно, это при условии, что его(софт) вообще удастся запустить на ПК, вот и пришлось искать вариант МК для комфортной работы, в качестве костылей я конечно буду подключать внешний SD адаптер, вариант работоспособный, но хотелось бы понять как именно пользоваться имеющимся на борту слотом для карт памяти,

ну, теперь, значить, придётся английский учить.

С языком проблем нет, проблема в том, что на их форум невозможно зайти, бан по ай пи, причём рандомно - то есть то нет, никакие випиэны не поиогают, вот и ищу людей которые бы могли направить меня в нужную сторону

Это как? Да и esp32 имеется в природе

Зы: глянул цены на teensy 4.1 - мда уж… ))

Во-первых, это, мягко говоря, вранье.
31х33 это всего лишь порядка тысячи пикселей, с этим справится даже Мега, не то что nodemcu с ее 40К памяти.

Во-вторых, если не подходит nodemcu - то можно было бы выбрать ЕСП32, РП2040 или СТМ - варианты которые в разы дешевле и куда более обкатаны, чем Тенси

Я не слышал. что кто-то на нашем форуме работал с Тенси. Поэтому информацию вам придется искать самому.

3 лайка


ТС заплатил такую цену за этот микроконтроллер, даже не зная данной железки. Как так то. Это понты?

1 лайк

смотрим что говорит пример:

/*
  SD card file dump
 
 This example shows how to read a file from the SD card using the
 SD library and send it over the serial port.
 	
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11, pin 7 on Teensy with audio board
 ** MISO - pin 12
 ** CLK - pin 13, pin 14 on Teensy with audio board
 ** CS - pin 4, pin 10 on Teensy with audio board
 
 created  22 December 2010
 by Limor Fried
 modified 9 Apr 2012
 by Tom Igoe
 
 This example code is in the public domain.
 	 
 */

и распиновка в ядре:

/* Teensyduino Core Library
 * http://www.pjrc.com/teensy/
 * Copyright (c) 2018 PJRC.COM, LLC.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * 1. The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * 2. If the Software is incorporated into a build system that allows
 * selection among a list of target devices, then similar target
 * devices manufactured by PJRC.COM must be included in the list of
 * target devices and selectable in the same manner.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#ifndef pins_macros_for_arduino_compatibility_h
#define pins_macros_for_arduino_compatibility_h

#include <stdint.h>

// A0-A9 are always digital 14-23, for Arduino compatibility
#define PIN_A0  (14)
#define PIN_A1  (15)
#define PIN_A2  (16)
#define PIN_A3  (17)
#define PIN_A4  (18)
#define PIN_A5  (19)
#define PIN_A6  (20)
#define PIN_A7  (21)
#define PIN_A8  (22)
#define PIN_A9  (23)
#define PIN_A10 (24)
#define PIN_A11 (25)
#define PIN_A12 (26)
#define PIN_A13 (27)
static const uint8_t A0 = PIN_A0;
static const uint8_t A1 = PIN_A1;
static const uint8_t A2 = PIN_A2;
static const uint8_t A3 = PIN_A3;
static const uint8_t A4 = PIN_A4;
static const uint8_t A5 = PIN_A5;
static const uint8_t A6 = PIN_A6;
static const uint8_t A7 = PIN_A7;
static const uint8_t A8 = PIN_A8;
static const uint8_t A9 = PIN_A9;
static const uint8_t A10 = PIN_A10;
static const uint8_t A11 = PIN_A11;
static const uint8_t A12 = PIN_A12;
static const uint8_t A13 = PIN_A13;
#ifdef ARDUINO_TEENSY41
#define PIN_A14 (38)
#define PIN_A15 (39)
#define PIN_A16 (40)
#define PIN_A17 (41)
static const uint8_t A14 = PIN_A14;
static const uint8_t A15 = PIN_A15;
static const uint8_t A16 = PIN_A16;
static const uint8_t A17 = PIN_A17;
#endif

#define LED_BUILTIN   (13)

#define PIN_SPI_SS    (10)
#define PIN_SPI_MOSI  (11)
#define PIN_SPI_MISO  (12)
#define PIN_SPI_SCK   (13)
static const uint8_t SS = 10;
static const uint8_t MOSI = 11;
static const uint8_t MISO = 12;
static const uint8_t SCK = 13;

#define PIN_WIRE_SDA  (18)
#define PIN_WIRE_SCL  (19)
static const uint8_t SDA = 18;
static const uint8_t SCL = 19;

#define PIN_SERIAL_RX (0)
#define PIN_SERIAL_TX (1)


#if defined(ARDUINO_TEENSY40)
  #define NUM_DIGITAL_PINS  40
  #define NUM_ANALOG_INPUTS 14
#elif defined(ARDUINO_TEENSY41)
  #define NUM_DIGITAL_PINS  55
  #define NUM_ANALOG_INPUTS 18
#elif defined(ARDUINO_TEENSY_MICROMOD)
  #define NUM_DIGITAL_PINS  46
  #define NUM_ANALOG_INPUTS 14
#endif

#define NOT_AN_INTERRUPT -1


#if defined(__IMXRT1062__) && defined(ARDUINO_TEENSY40)
  #define analogInputToDigitalPin(p) (((p) <= 9) ? (p) + 14 : (( ((p) >= 14 && (p) <= 27)) ? (p) : -1))
  #define digitalPinHasPWM(p) ((p) <= 15 || (p) == 18 || (p) == 19 || ((p) >= 22 && (p) <= 25) || (p) == 28 || (p) == 29 || ((p) >= 33 && (p) <= 39))

#elif defined(__IMXRT1062__) && defined(ARDUINO_TEENSY41)
  #define analogInputToDigitalPin(p) (((p) <= 9) ? (p) + 14 : (( ((p) >= 14 && (p) <= 27)) || ((p) >= 38 && (p) <= 41) ? (p) : -1))
  #define digitalPinHasPWM(p) ((p) <= 15 || (p) == 18 || (p) == 19 || ((p) >= 22 && (p) <= 25) || (p) == 28 || (p) == 29 || (p) == 33 || (p) == 36 || (p) == 37 || ((p) >= 42 && (p) <= 47) || (p) == 51 || (p) == 54)

#elif defined(__IMXRT1062__) && defined(ARDUINO_TEENSY_MICROMOD)
  #define analogInputToDigitalPin(p) (((p) <= 9) ? (p) + 14 : (( ((p) >= 14 && (p) <= 27)) ? (p) : -1))
  #define digitalPinHasPWM(p) ((p) <= 15 || (p) == 18 || (p) == 19 || ((p) >= 22 && (p) <= 25) || (p) == 28 || (p) == 29 || (p) == 33 || (p) == 40 || (p) == 41 || (p) == 45)
#endif
  #define digitalPinToInterrupt(p)  ((p) < NUM_DIGITAL_PINS ? (p) : -1)


#define digitalPinToPCICR(p)    ((volatile uint8_t *)0)
#define digitalPinToPCICRbit(p) (0)
#define digitalPinToPCIFR(p)    ((volatile uint8_t *)0)
#define digitalPinToPCIFRbit(p) (0)
#define digitalPinToPCMSK(p)    ((volatile uint8_t *)0)
#define digitalPinToPCMSKbit(p) (0)


struct digital_pin_bitband_and_config_table_struct { // not really bitband, old name from Teensy3
	volatile uint32_t *reg;
	volatile uint32_t *mux;
	volatile uint32_t *pad;
	uint32_t mask;
};
extern const struct digital_pin_bitband_and_config_table_struct digital_pin_to_info_PGM[];
#define digitalPinToPort(pin)    (pin)
#define digitalPinToBitMask(pin) (digital_pin_to_info_PGM[(pin)].mask)
#define portOutputRegister(pin)  ((digital_pin_to_info_PGM[(pin)].reg + 0))
#define portSetRegister(pin)     ((digital_pin_to_info_PGM[(pin)].reg + 33))
#define portClearRegister(pin)   ((digital_pin_to_info_PGM[(pin)].reg + 34))
#define portToggleRegister(pin)  ((digital_pin_to_info_PGM[(pin)].reg + 35))
#define portInputRegister(pin)   ((digital_pin_to_info_PGM[(pin)].reg + 2))
#define portModeRegister(pin)    ((digital_pin_to_info_PGM[(pin)].reg + 1))
#define portConfigRegister(pin)  ((digital_pin_to_info_PGM[(pin)].mux))
#define portControlRegister(pin) ((digital_pin_to_info_PGM[(pin)].pad))
#define digitalPinToPortReg(pin) (portOutputRegister(pin))
#define digitalPinToBit(pin)     (__builtin_ctz(digitalPinToBitMask(pin)))


#define NOT_ON_TIMER 0
static inline uint8_t digitalPinToTimer(uint8_t) __attribute__((always_inline, unused));
static inline uint8_t digitalPinToTimer(uint8_t pin __attribute__((unused)))
{
	// TODO: does anything meaningful use this?
	return NOT_ON_TIMER;
}

// 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.
//
#if F_CPU >= 20000000 && !defined(USB_DISABLED)
#define SERIAL_PORT_MONITOR		Serial
#else
#define SERIAL_PORT_MONITOR		Serial1
#endif
#define SERIAL_PORT_USBVIRTUAL		Serial
#define SERIAL_PORT_HARDWARE		Serial1
#define SERIAL_PORT_HARDWARE1		Serial2
#define SERIAL_PORT_HARDWARE2		Serial3
#define SERIAL_PORT_HARDWARE_OPEN	Serial1
#define SERIAL_PORT_HARDWARE_OPEN1	Serial2
#define SERIAL_PORT_HARDWARE_OPEN2	Serial3
#define SERIAL_PORT_HARDWARE3		Serial4
#define SERIAL_PORT_HARDWARE4		Serial5
#define SERIAL_PORT_HARDWARE5		Serial6
#define SERIAL_PORT_HARDWARE6		Serial7
#define SERIAL_PORT_HARDWARE_OPEN3	Serial4
#define SERIAL_PORT_HARDWARE_OPEN4	Serial5
#define SERIAL_PORT_HARDWARE_OPEN5	Serial6
#define SERIAL_PORT_HARDWARE_OPEN6	Serial7
#if defined(__IMXRT1052__)   
#define SERIAL_PORT_HARDWARE7		Serial8
#define SERIAL_PORT_HARDWARE_OPEN7	Serial8
#endif

#define SerialUSB			Serial

#define WIRE_INTERFACES_COUNT		3
#define SPI_INTERFACES_COUNT		3

#endif // pins_macros_for_arduino_compatibility_h

вообще-то он 40 зелёных стоит

SD-карта
Встроенный разъем SD позволяет использовать SD-карты для хранения больших объемов данных. Библиотека Arduino SD используется для доступа к карте с помощью SD.begin(BUILTIN_SDCARD). Этот встроенный разъем SD использует быстрый 4-битный собственный SDIO для доступа к карте. Карты SD также можно использовать через контакты SPI с помощью SD.begin(cspin), используя более медленный однобитный протокол SPI для доступа к карте.

я подозреваю что он не из Рф.
У них там Тенси доступнее.

Согласен. Наверно учиться на паркетнике легче, чем на запоре)) Электроника помогает.

куплю дейтвующий макет, который будет управлять матрицей 31х33 ws2812, при этом обязательное условие - эффекты доллжны быть записаны на SD card. И для создания эффектов используется jinx.

Вам огромное спасибо! Вы реально и очень помогли!

И всё-таки, что значит не работает на node mcu? В чем это выражается?

Выражается вот в чём:
Первый проект 16х17 (272 пикселя) прекрасно работал, 31х33 (1023 пикселя) воспроизводил только первый, статичный кадр, путем проб было выявлено, что максимум , который способен ,вывозить, nodemcu 512 пикселей, больше - воспроизводит только первый кадр анимации, хотя компилируется проект замечательно, без ошибок, но в железе не работает. На некоторых форумах нашел коллег по несчастью, которым так же не удалось заставить работать более 512 штук ws2812

#include <FastLED.h>

#include <SPI.h>

#include <SD.h>

#define NUM_LEDS 272 // LED number

#define DATA_PIN D1 // your data arduino pin

#define CHIPSET WS2812B // your LED chip type

#define COLOR_ORDER GRB

#define BRIGHTNESS 50

int count_files = 20; // Количество файлов

File fxdata;

CRGB leds[NUM_LEDS];

int val;

void setup()

{

FastLED.addLeds<CHIPSET, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );

FastLED.setBrightness(BRIGHTNESS);

for(int y = 0 ; y < NUM_LEDS ; y++)

{

leds[y] = CRGB::Black; // set all leds to black during setup

}

FastLED.show();

pinMode(10, OUTPUT); // CS/SS pin as output for SD library to work.

digitalWrite(10, HIGH); // workaround for sdcard failed error...

if (!SD.begin(4))

{

Serial.println("sdcard initialization failed!");

return;

}

Serial.println("sdcard initialization done.");

// test file open

fxdata = SD.open("1.out"); // read only

if (fxdata)

{

Serial.println("file open ok");

fxdata.close();

}

}

void loop()

{

for(val = 1; val <= count_files; val++)

{

fxdata = SD.open(String(val)+".out"); // read only

if (fxdata)

{

Serial.println("file open ok");

}

while (fxdata.available())

{

Sortled();

FastLED.show();

delay(50); // set the speed of the animation. 20 is appx ~ 500k bauds

}

// close the file in order to prevent hanging IO or similar throughout time

fxdata.close();

}

}

int Sortled () {

CRGB templeds[NUM_LEDS];

const uint32_t XYTable[] = {

255, 254, 221, 220, 187, 186, 153, 152, 119, 118, 85, 84, 51, 50, 17, 16,

256, 253, 222, 219, 188, 185, 154, 151, 120, 117, 86, 83, 52, 49, 18, 15,

257, 252, 223, 218, 189, 184, 155, 150, 121, 116, 87, 82, 53, 48, 19, 14,

258, 251, 224, 217, 190, 183, 156, 149, 122, 115, 88, 81, 54, 47, 20, 13,

259, 250, 225, 216, 191, 182, 157, 148, 123, 114, 89, 80, 55, 46, 21, 12,

260, 249, 226, 215, 192, 181, 158, 147, 124, 113, 90, 79, 56, 45, 22, 11,

261, 248, 227, 214, 193, 180, 159, 146, 125, 112, 91, 78, 57, 44, 23, 10,

262, 247, 228, 213, 194, 179, 160, 145, 126, 111, 92, 77, 58, 43, 24, 9,

263, 246, 229, 212, 195, 178, 161, 144, 127, 110, 93, 76, 59, 42, 25, 8,

264, 245, 230, 211, 196, 177, 162, 143, 128, 109, 94, 75, 60, 41, 26, 7,

265, 244, 231, 210, 197, 176, 163, 142, 129, 108, 95, 74, 61, 40, 27, 6,

266, 243, 232, 209, 198, 175, 164, 141, 130, 107, 96, 73, 62, 39, 28, 5,

267, 242, 233, 208, 199, 174, 165, 140, 131, 106, 97, 72, 63, 38, 29, 4,

268, 241, 234, 207, 200, 173, 166, 139, 132, 105, 98, 71, 64, 37, 30, 3,

269, 240, 235, 206, 201, 172, 167, 138, 133, 104, 99, 70, 65, 36, 31, 2,

270, 239, 236, 205, 202, 171, 168, 137, 134, 103, 100, 69, 66, 35, 32, 1,

271, 238, 237, 204, 203, 170, 169, 136, 135, 102, 101, 68, 67, 34, 33, 0

};

fxdata.readBytes((char*)templeds, NUM_LEDS*3);

for (int k=0; k < NUM_LEDS; k++) {

leds[XYTable[k]] = templeds[k];

}

}

от того, что вы нашли неудачников, которые не смогли запустить 512 диодов - вовсе не следует. что это невозможно