Skip to content

Commit e3fea33

Browse files
committed
update to support TFTgizmo
1 parent 891849a commit e3fea33

1 file changed

Lines changed: 40 additions & 17 deletions

File tree

Hallowing_Minotaur_Maze/MinotaurMaze.ino

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,27 @@
1010
#include <Adafruit_ST7735.h> // Display-specific graphics library
1111
#include <Adafruit_ZeroDMA.h> // Direct memory access library
1212

13-
#define TFT_RST 37 // TFT reset pin
14-
#define TFT_DC 38 // TFT display/command mode pin
15-
#define TFT_CS 39 // TFT chip select pin
16-
#define TFT_BACKLIGHT 7 // TFT backlight LED pin
13+
#ifdef ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS
14+
#define TFT_RST -1
15+
#define TFT_DC A6
16+
#define TFT_CS A7
17+
#define TFT_BACKLIGHT A3 // Display backlight pin
18+
#define TFT_SPI SPI1
19+
#define TFT_PERIPH PERIPH_SPI1
20+
Adafruit_LIS3DH accel(&Wire1);
21+
#else
22+
#define TFT_RST 37 // TFT reset pin
23+
#define TFT_DC 38 // TFT display/command mode pin
24+
#define TFT_CS 39 // TFT chip select pin
25+
#define TFT_BACKLIGHT 7 // TFT backlight LED pin
26+
#define TFT_SPI SPI
27+
#define TFT_PERIPH PERIPH_SPI
28+
Adafruit_LIS3DH accel;
29+
#endif
30+
1731

1832
// Declarations for some Hallowing hardware -- display, accelerometer, SPI
19-
Adafruit_ST7735 tft(TFT_CS, TFT_DC, TFT_RST);
20-
Adafruit_LIS3DH accel;
33+
Adafruit_ST7735 tft(&TFT_SPI, TFT_CS, TFT_DC, TFT_RST);
2134
SPISettings settings(12000000, MSBFIRST, SPI_MODE0);
2235

2336
// Declarations related to DMA (direct memory access), which lets us walk
@@ -113,11 +126,13 @@ uint32_t startTime, frames = 0; // For frames-per-second calculation
113126
void setup(void) {
114127
Serial.begin(115200);
115128

129+
Serial.println("Init accelerometer");
116130
// Initialize accelerometer, set to 2G range
117131
if(accel.begin(0x18) || accel.begin(0x19)) {
118132
accel.setRange(LIS3DH_RANGE_2_G);
119133
}
120134

135+
Serial.println("Init display");
121136
// Initialize and clear screen
122137
tft.initR(INITR_144GREENTAB);
123138
tft.setRotation(1);
@@ -131,48 +146,49 @@ void setup(void) {
131146
digitalWrite(TFT_CS, LOW);
132147
digitalWrite(TFT_DC, LOW);
133148
#ifdef ST77XX_MADCTL
134-
SPI.transfer(ST77XX_MADCTL); // Current TFT lib
149+
TFT_SPI.transfer(ST77XX_MADCTL); // Current TFT lib
135150
#else
136-
SPI.transfer(ST7735_MADCTL); // Older TFT lib
151+
TFT_SPI.transfer(ST7735_MADCTL); // Older TFT lib
137152
#endif
138153
digitalWrite(TFT_DC, HIGH);
139-
SPI.transfer(0x28);
154+
TFT_SPI.transfer(0x28);
140155
digitalWrite(TFT_CS, HIGH);
141156

142157
pinMode(TFT_BACKLIGHT, OUTPUT);
143158
digitalWrite(TFT_BACKLIGHT, HIGH); // Main screen turn on
159+
Serial.println("Init backlight");
144160

145161
// Set up SPI DMA. While the Hallowing has a known SPI peripheral and this
146162
// could be much simpler, the extra code here will help if adapting this
147163
// sketch to other SAMD boards (Feather M0, M4, etc.)
148164
int dmac_id;
149165
volatile uint32_t *data_reg;
150166
dma.allocate();
151-
if(&PERIPH_SPI == &sercom0) {
167+
if(&TFT_PERIPH == &sercom0) {
152168
dma.setTrigger(SERCOM0_DMAC_ID_TX);
153169
data_reg = &SERCOM0->SPI.DATA.reg;
154170
#if defined SERCOM1
155-
} else if(&PERIPH_SPI == &sercom1) {
171+
} else if(&TFT_PERIPH == &sercom1) {
156172
dma.setTrigger(SERCOM1_DMAC_ID_TX);
157173
data_reg = &SERCOM1->SPI.DATA.reg;
158174
#endif
159175
#if defined SERCOM2
160-
} else if(&PERIPH_SPI == &sercom2) {
176+
} else if(&TFT_PERIPH == &sercom2) {
161177
dma.setTrigger(SERCOM2_DMAC_ID_TX);
162178
data_reg = &SERCOM2->SPI.DATA.reg;
163179
#endif
164180
#if defined SERCOM3
165-
} else if(&PERIPH_SPI == &sercom3) {
181+
} else if(&TFT_PERIPH == &sercom3) {
166182
dma.setTrigger(SERCOM3_DMAC_ID_TX);
167183
data_reg = &SERCOM3->SPI.DATA.reg;
168184
#endif
169185
#if defined SERCOM4
170-
} else if(&PERIPH_SPI == &sercom4) {
186+
} else if(&TFT_PERIPH == &sercom4) {
171187
dma.setTrigger(SERCOM4_DMAC_ID_TX);
172188
data_reg = &SERCOM4->SPI.DATA.reg;
173189
#endif
174190
#if defined SERCOM5
175-
} else if(&PERIPH_SPI == &sercom5) {
191+
} else if(&TFT_PERIPH == &sercom5) {
176192
dma.setTrigger(SERCOM5_DMAC_ID_TX);
177193
data_reg = &SERCOM5->SPI.DATA.reg;
178194
#endif
@@ -216,10 +232,17 @@ void loop() {
216232
uint8_t mapX = (uint8_t)posX, // Current square of map
217233
mapY = (uint8_t)posY; // (before changing pos.)
218234
accel.read(); // Read accelerometer
235+
#ifdef ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS
236+
heading += (float)accel.x / -20000.0; // Update direction
237+
float v = (abs(accel.y) < abs(accel.z)) ? // If board held flat(ish)
238+
(float)accel.y / 20000.0 : // Use accel Y for velocity
239+
(float)accel.z / -20000.0; // else accel Z is velocity
240+
#else
219241
heading += (float)accel.y / -20000.0; // Update direction
220242
float v = (abs(accel.x) < abs(accel.z)) ? // If board held flat(ish)
221243
(float)accel.x / 20000.0 : // Use accel X for velocity
222244
(float)accel.z / -20000.0; // else accel Z is velocity
245+
#endif
223246
if(v > 0.19) v = 0.19; // Keep speed under 0.2
224247
else if(v < -0.19) v = -0.19;
225248
float vx = cos(heading) * v, // Direction vector X, Y
@@ -242,7 +265,7 @@ void loop() {
242265
posX = newX;
243266
posY = newY;
244267

245-
SPI.beginTransaction(settings); // SPI init
268+
TFT_SPI.beginTransaction(settings); // SPI init
246269
digitalWrite(TFT_CS, LOW); // Chip select
247270
tft.setAddrWindow(0, 0, 128, 128); // Set address window to full screen
248271
digitalWrite(TFT_CS, LOW); // Re-select after addr function
@@ -350,7 +373,7 @@ void loop() {
350373
}
351374
while(dma_busy); // Wait for last DMA transfer to complete
352375
digitalWrite(TFT_CS, HIGH); // Deselect
353-
SPI.endTransaction(); // SPI done
376+
TFT_SPI.endTransaction(); // SPI done
354377

355378
if(!(++frames & 255)) { // Every 256th frame, show frame rate
356379
uint32_t elapsed = (millis() - startTime) / 1000;

0 commit comments

Comments
 (0)