A twittering echos through the air Singing the music of spring As a new generation steps to embark On the journey of all living things
My family didn’t take a lot of what some would consider vacations when I was a kid. An annual trip camping for a few days in the nearby mountains was about all we managed most years. There were also times when we packed up to go somewhere more exotic like a national park, or to visit relatives far away. Among the memories of these trips I have shadows of memories where my parents were stressing about them — both before and during. I sometimes think a lot of the stress was financial, but the root cause is somewhat immaterial. The bottom line is that I’m not sure vacations were all that fun for my parents.
Universally, the half dozen kids in our family would argue non-stop over petty little things, we’d complain about whatever it was that they had planned for the day, be unhappy with the food they prepared, whine about being tired, and generally do almost anything we could to be ungrateful little twits. It wasn’t enough that we made ourselves miserable… We seemed to feel a need to make or parents miserable too. As I look back, I’m convinced we met with a great deal of success.
As time passes I think I understand better what my siblings and I put our parents through. Liz and I plan vacations and do our best to give the kids great opportunities and memories, but along the way it seems the best they can muster is to whine and complain about almost every aspect of the trip. Take them to one of the greatest wonders on the planet, and the walks are too long, the food we packed isn’t what they wanted, they actively try to irritate each other at least every ten seconds, and just want to sit back in the room and watch mindless cable shows all day. To ice the cake, I’m a stingy and unreasonable jerk when I don’t want to waste money on gift shop trash that I’m likely going to get stuck carrying all day and will certainly be thrown away and forgotten in a few days.
Along the way, I have to keep a calm voice and try to keep the peace as one after another of the party decide it’s time to suck the oxygen out of the room and burn everything to the ground. It’s exhausting, and has happened everywhere from Washington DC to Zion National Park. The hardest part is not burning it down myself.
Now, I have several fond memories of the vacations we took as kids, and have only really understood the burden they were on my parents as I’ve grown older. Because of this, I have hope that I’m not just wasting my time and even more limited energy. However, it is often trying. Pressing forward, hoping that we can keep it together just enough that the good memories float to the top and drown out the bad, is hard to do. It’s a bad day when I’m ready to go back to a job I don’t really like just to wind down from vacation, and I’m just about there again.
Stop, I'm told, and smell a rose. Pause and take a break. So I comply. The smell offends my nose. Why don't you do what others do? I'm asked without words. But I'm not them. Must I pretend to be like you? What's wrong with loving work? Both the process and results? Rest is wearying. But labor refreshes and refuels.
Since we moved back into a city and left behind a mostly rural life I’ve had to adjust my hobbies to the new environment. I don’t spend much time planting fence posts, the only animal I take care of now is an old and grouchy dog, I don’t have old or worn out farm equipment to rebuild or repair, can mow my lawn with a weed whacker, and couldn’t fit a car in the garage to work on it if I had to. This has been a hard transition, but it has given me an excuse to reengage with several hobbies that have lain dormant for quite a while. One of the things I’ve restarted has been playing with electronics.
Back in high school I spent a lot of time in the electronics shop designing and building various projects that included a simple television jammer, an all electronic Christmas tree that could flash lights in various sequences, and a custom built clock that was crazy enough that it made airport security really uncomfortable when I took it to Kansas City for a national competition (after x-raying it, they made me disassemble it and show them it wasn’t a bomb). My brother Tolon and our neighbor Mike have tons of stories about the crazy stuff we did with electronics growing up, so needless to say, it was a big part of our adolescence. However, once I left college and the part-time television repair job I had, electronics mostly fell by the wayside. It wasn’t that the interest faded. It was really just that I had a long list of competing priorities and interests. Besides, I don’t have much use for the kinds of simple projects I could build at home. While flashing lights are cool in some respects, it doesn’t do much for me once it’s built. I have a higher standard of applicability for projects these days.
This last Christmas, however, I bought Isaac a robot car that used a raspberry pi for the controller. Unfortunately (or not, depending on how you look at it), the cheap Chinese version I bought came with code that was so bad that I spent my Christmas break learning Python and writing new code from scratch. I hadn’t done much coding for a long time, and in the process of making a functional software set for the robot I remembered how much I like that kind of a puzzle and challenge. Another thing working on Isaac’s robot did was get me back looking at electronics hardware design and thinking about the software/hardware interface in ways I hadn’t before. I have been a Linux geek for over 20 years, and the possibilities of a super-cheap, super-small Linux-based computer with exposed low-level I/O ports really piqued my interest to the extent that I actually had a spell of insomnia while a whole host of ideas for things I could do with it flooded my mind.
It didn’t take too long for me to realize that the best way to get sleep would be to pick a project and get to work on it. As I thought about it, I kept coming back to a project I’d built years ago and decided it was time to update it and build it again. The original project was nothing more than a Mr Coffee that I stripped the electronics out of and repurposed to turn on a light at a given time every day. This light woke me up every morning for several years, but it was bulky and ugly, and the way the light turned fully on instantaneously was rather jarring. In an effort to fix this shortcoming, about five years ago I designed and built an analog circuit to gradually turn on a bright LED lamp. Unfortunately, Liz hated the bright white color and couldn’t stand the fact that the LEDs weren’t diffuse enough. They were rather blinding if you looked right at them. I had to retire the light and Mr Coffee electronics.
In thinking about the possibilities of a super cheap computer with easy to use hardware interfaces, I came to the conclusion that I could easily build a control circuit to digitally dim a three color LED. I decided to build a raspberry pi based project that would mimic both the brightness and color of a sunrise at any time I wanted to wake up. Because it was software driven, I could tailor both the brightness and color to match a sunrise from start to finish. I would also be able to set it up so that I could program different alarms for weekends or any other unusual day. Not only that, but I could even program it to do any kind of goofy rainbow-colored light show if I ever got the inkling (but I have to admit that the odds of that are kind of low).
Now, I haven’t made custom circuit boards in almost 20 years, and I haven’t written much code since I left grad school. A sane person might hesitate to jump into what amounts to two simultaneous complex projects, and you might think it would at least have given me pause. But no, true to form I jumped in. I scoured datasheets from several electronics vendors, ordered materials for etching circuit boards, and began learning Eagle CAD. Before too long, I had a schematic complete. Not long after that, I had a circuit board layout. A few failed attempts later I had a complete board and was on my merry way writing code to see if it would all come together the way I intended it.
After fumbling around with Python and learning some of it’s ‘features’ the hard way, I managed to make the LCD and buttons I bought work as a menu of sorts, and got it to start the sunrise sequence on-schedule. Pretty stoked about my progress, I plugged it in near my bed and set it to go off the next morning. Unfortunately (or perhaps fortunately) I woke up a few minutes before the alarm and was watching it as the first blue-gray light started to come on. Almost immediately, I realized my design wasn’t going to work. At low brightness, the light flickered enough to really bother me. I wanted to understand why, and what I could do about it.
As it turns out, one of my day-job responsibilities is setting design criteria for safety critical systems, and I had spent a good deal of time recently getting familiar with what are known as “real-time operating systems” and their role in safety-critical applications. In any modern computer, multiple processes (programs) compete for processor time. The operating system will hand control to a process, and how long that process has control before the next process gets to do it’s part is not tightly controlled. For example, if you’ve ever been working on a computer that suddenly ‘hiccuped’ for a second and then caught up with you, you have been the victim of a non-real time system.
For routine applications, a slight hiccup that results from a process taking too much processor time isn’t all that important. The process will eventually finish and the computer will catch up without any dramatic consequences. However, if that computer were flying a plane or guiding a missile, even a slight hiccup could result in a crash. For these situations, a special type of operating system is put in place to make sure that the important stuff always gets the processor time it needs, and only the unimportant stuff occasionally gets stuck with a hiccup (if at all). Everything runs on a heartbeat, and important stuff gets done every heartbeat, every time. When done properly, this kind of a system ensures that there aren’t any hiccups on things that matter.
So, how does this apply to my stupid little project? First, it’s fundamentally difficult to efficiently dim an LED the way you would dim a conventional light bulb — especially using a digital controller. Instead, to dim a high power LED you turn it on and off very rapidly, and our eyes average the intensity naturally. To make the light brighter, you leave the light on for a longer percentage of the time.
Well, as it turns out, the code that determines how long the LED stays on works by deciding every few microseconds whether to turn the light on or off. Because the ultra-bright LED’s I used are so bright, when I want them to be very dim the lights are only on for a few of these cycles before they turn back off again. Even small changes in how long the lights are on in that case make a big difference in how bright the light looks. The way this thing is set up, it turns the LED on and off 200 times a second (each cycle is 1/200th of a second) to make sure the human eye can’t see it flickering. To make the sunrise work, I break that 1/200th of a second into 1024 chunks (why not just a round 1000 you ask… 1024 = 2^10, and computers do most things best with powers of 2). When the light is at it’s dimmest, it’s on for 1 chunk (about 1/200,000th of a second) every cycle. When the light is all the way on, it’s on for the full 1024 chunks and never turns off.
When the light is at it’s dimmest (where I start it in a sunrise sequence) even a five microsecond delay (about 100000 times faster than a blink of the eye) will cause the light to stay on twice as long as it should and change the brightness by a factor of two. Small glitches make a big difference. As the code runs through it’s loop deciding when to turn the light on or off, other processes randomly run a little long, and the decision to turn off the light is delayed just a bit. Because the raspberry pi isn’t running a real-time operating system, there is competition for processor time, and that shows up as a flickering light that flickers worst when it’s on very low. Because I’d just been through the wringer working through the real-time operating system stuff at work, I instantly recognized the situation for what it was.
Unfortunately, this realization meant that my design was fundamentally flawed. I had relied on the pi for timing, and even using the most optimized code I could find to run the timing, the light still had a noticeable flicker. Did that stop me? If you are reading this, the odds are pretty good that you know a fair bit about me already, and could guess that I don’t quit that easily. One solution would be to implement the code in a real-time operating system. However, I’m not really an expert on those systems, and I don’t believe they’ve ported real-time linux to the pi. The answer would have to be a hardware-based timer for the lights, and the best part is that I already knew where to go to find one.
Something I learned while working with Isaac’s robot car was how servos work (the small motors that steer the car and point the camera). They work by generating a pulse with a very specific width proportional to the turn angle at regular intervals, just like the way I was trying to control the lights. Robot designers don’t use the I/O pins on the pi to control servos for the same reason it didn’t work well for the lights — flickering, but in the case of servos, they don’t flicker, they jitter back and forth. If you’re using the servo to control a remote-control plane for instance, that jitter would make the plane uncontrollable and result in a crash. In Isaac’s car, the designers had actually re-purposed an LED controller with built-in timing to generate the servo pulses, and I was already familiar with how that controller worked and how to program it using the pi. It would be an easy answer.
Frustrated, but unwilling to give up, I pulled open the schematic, deleted the control lines that I had been using, and added in the controller. A few days of spare-time later, and I had a new board layout ready to process. Thankfully, when I originally ordered parts for the first board, I had planned for the probability that I’d ruin several boards and had ordered plenty of extra resist film and copper-clad board. I was also willing to bet I’d break something or need to re-build another board, so I had spares of all the parts. I etched and solder-masked another board and built it out with everything but the new controller. At this point, I’m waiting to order the new part and am looking forward to getting the code written and version 3 up and running (version 1 died before the first hardware met the real world).
At this point, if I were to add up the number of hours and the money spent on parts and processing stuff, this would definitively be the most expensive clock I’ve ever owned. To make it worse, I’m looking at probably 20 more hours of coding to fix bugs in the current code and integrate the new controller (I’m not particularly efficient with Python). Given my going labor rate, I can’t afford my own time. But then again, it’s not really about either the cost or the time.
I'm told it'd be better and cost less, If I hired the experts to do it. They reason true. I know. My time's too costly for stuff like this, I should just pay someone else. Again, they're right. I know. But money and time aren't the point, I do it myself 'cause I can. Joy has value. I know.
Isaac was preparing for a campout with the young men from church a couple of weeks ago when Michael asked when I could take him camping. The weather has been mostly cooperating, so I told him we’d go in two weeks if the weather cooperated. Two weeks went by and the weather was fine, so we packed up the truck and headed to an area just outside the Ojito wilderness.
We found a place just off the road and made a fine camp for the night. After setting up camp, the boys and the dog explored a deep arroyo nearby while I made dinner and gathered firewood. We spent the evening watching the fire and just hanging out until bed.
When we woke up the water was frozen solid, and Michael was none too happy about the cold. However, a campfire, some hot chocolate, and a pancake breakfast make everything better… Even the cold of an early spring morning in the high desert. I love the high desert in the morning.
After the sun came up, we put out the fire and hiked up a nearby mesa to explore. Thornton had a blast sniffing around, and even managed to flush out a rabbit, but I don’t think he’d make a good coyote… The rabbit got away with a large margin of safety. Along the way, the boys each found several partially complete arrowheads along with a bunch of other interesting rocks. After the hike, we set up targets and the boys spent about an hour shooting at clay pigeons they had found the day before.
One downside of BLM land is that there are always people who don’t seem to care what condition they leave it in. The area we were camped in was littered with spent cases, beer cans, and all kinds of other trash. Before we left, the boys and I policed up the area — filling a large (55ga) trashbag in the process (I take huge bags with me just for this reason). I hope my boys understand how important it is to take good care of what God has given us. I was proud of them for not complaining that the mess wasn’t theirs. The area looked much better when we left.
A good weekend, all in all.
Several years ago, I was at a three month professional development course that included intramural sports. As we went through the first day orientation, the school director took a moment and asked each of us to pull out our IDs. He then instructed is to look at the birthday printed on the card and ponder our age. He then told us to repeat this exercise every time we entered the gym and keep that in mind as we competed with each other. Apparently, students there had a track record of pushing too hard and getting hurt. This was good advice, but advice that was rarely implemented.
I was reminded of this vignette when I was getting ready to go out on the gym floor with Isaac this last Tuesday. Several of the other parents were commenting on the fact that I work out with the kids, and I mentioned this experience in passing as a way to laugh off the fact that I’m a whole lot older than anyone else who trains there. That’s when karma struck.
After a brief warmup, I got ready to throw the first flip of the night. However, the foam pit had a mat covering the foam. I was doing well with many different flips, so I decided to just go for it. Being over confident, I got a good run at it and launched into a side flip. Now… I’ve had trouble getting enough vertical elevation of side flips, so I tend to stay in a tuck almost to the end. But, this time, I got plenty of air and way over rotated. I landed hard on my ankle, and was immediately aware that things weren’t normal. The burning pain was all I needed to know that my night of training flips and flyaways was over.
It turned out to just be a sprain, but as I hobbled into work Wednesday morning on crutches my co-workers got no end of pleasure out of asking me how I got hurt. A few only asked if I was with Isaac then laughed and walked away smirking knowingly. Almost everyone knew the crux of the matter before they asked. My track record of injuries resulting from me acting like a kid at the gym is almost a running joke.
Oh well… Another few days and I can start working my way back into training with Isaac. It’ll be hard not to get hurt again given my tendency to recognize that something is risky and then promptly jump right in. I guess I need to get better at following my own advice. Maybe this time will be different… Or… Maybe not… But I’ll have fun either way.
This year, I crossed the threshold of 40. I understand that transition to be fairly traumatic for many people, but I must be in denial. I don’t feel like 40 is much of a big deal. I do, however, distinctly remember when 16 looked mature, 20 was fully fledged adult, 30 looked middle aged, and 40 was near death. There didn’t seem to me much space for development between 40 and death. Life and experience have taught me how warped my perspective was back then.
One thing I have loved about getting older is having kids who are old enough to have interests and hobbies I can share with them. There is something pretty cool about having philosophical discussions about great books, or talking about some of the more interesting experiments from psychology with Sydney. It’s a lot more rewarding than taking about fairies or random other “little girl” things I’ve never really understood or wanted to be a part of. Those moments were precious, but I have to admit I like the more mature discussions better.
Lately, Isaac has started to cross that threshold where his interests and hobbies are more interesting and engaging for me. For a little more than the last year, Isaac has been deliberately and diligently training in Par Kour (sp?). True to form, I got tired of just watching, and for the last few months I’ve been training too. Once a week Liz and I attend a class taught by Isaac’s trainer where we learn to do things like vault over obstacles, run up walls, and jump off of high things without hurting ourselves. About half the class (Liz and I included) are parents of the kids who are in Isaac’s advanced class, so it’s almost comical watching a bunch of middle aged parents act like kids on a playground, but all of us old farts in the class LOVE acting like kids — even if we can’t jump as high or move as fast as the kids do.
One day several weeks ago as I was watching Isaac and his cohorts doing their weekly flips and areal training at a gymnastics gym, I got bored and asked Isaac if he would mind if I trained with them. His smile said it all. I informed him he was my coach for the night, and we walked out to the gym floor together. Within a few minutes, he had me doing flips on the trampoline and into the foam pit. By the time the night was over, I had tried my first backflip over solid (ish) ground.
Three weeks on, and I’m still working on consistently landing backflips. They’re getting better, but it’ll be a while before I try one over concrete. My body is old and broken enough that training sessions with Isaac or his coach sometimes get cut short. But even when it hurts a little, it’s fun to see the look in Isaac’s eyes when I jump in and participate in something that he really enjoys. He smiled as big as I did when I pulled off a flyaway (doing a backflip swinging off of an elevated bar) last Tuesday.
I have to say that I’m grateful I have the energy and strength to jump in and do these things. I get a few odd looks from the younger crowd at the gym sometimes — I probably look like a dinosaur to them — but I’m well past the point where that will change my mind. About the only thing that slows me down is when my neck, shoulders, or back get particularly angry about the renewed assaults on already worn out body parts. For the most part, though, I’m amazed at the things I can do. I’m also pretty stoked that my aggressiveness and stupidity haven’t made my broken body worse. It helps to have a coach who learned how to do things right and do them without getting hurt.
I can’t say that I would have ever tried to do a backflip or vault a six foot wall had Isaac not started it all, but I wouldn’t trade the opportunity to spend time doing things with my kids for any of my self-motivated hobbies. I only hope I’m still fit for enough to do the same with Michael – whatever hobbies he decides to get into.
The rumble of wheels on gravel I prick my ears and take position For years I've tried diligently but failed Today is the day -- I will catch it today I launch with all the power in me It draws near and I lengthen my stride Barking fiercely and closing the gap A mouthful of rubber -- thrill of success Then searing pain and darkness close in As I ask myself why I wanted this.
It’s pretty clear to me at an academic level that many of the challenges I deal with on a regular basis are near universal. Challenges with teenagers, dissatisfaction with work, being stuck for a season in the spiritual doldrums, health challenges, personal weaknesses, demands on my time that far exceed the time available, profound cognitive dissonance between what I want and the world I am stuck with, and many other challenges are surely common. Unfortunately, that doesn’t generally make it feel any less lonely, any less troublesome, any less painful, or any less oppressive. Failure, though common to everyone, is experienced on an individual basis. The fact that failure is common doesn’t really make me feel any better about failing. Sometimes I wish I cared less and were better at shaking it off.