Posts Tagged ‘SSC-32’
FNR – Robot Mesh Network: MANOI & IRC
Using Twitter as a means of communication between the outside world and my robots isn’t a very reliable solution. Sometimes the website is down, and they don’t return search results in a timely manner. There were a few other options that I through around, like using gchat or IRC. IRC seems pretty fun, plus I have already done some playing around with it through the factbot idea.
To be honest, MANOI hasn’t been powered up since May. There were a few tune ups that were needed. This included a few hours of debugging in order to determine that the TX and RX wires got swapped that were going to the SSC-32. The SSC-32 was also having some power problems, so I added in a new switch:

The XBee is going to fit in behind the SSC-32, above the gyro and accelerometer sensor. You can see a part of it here:

Once this was all set, I started to communicate to MANOI through IRC.
Here’s a video of an explanation and demonstration:
Mesh Robots – MANOI & IRC from RobotGrrl on Vimeo.
The IRC bot runs from a Python script. The initial code that I used was from Cmd-c && Cmd-v (cool blog name!). They use the pyserial and irclib libraries. There are specific commands that will trigger certain events. The commands are actually the function definitions, it is all done through the magic of this line of code:
-
getModuleCallables()[cmd[0]](self.arduino)
The first command that I started out with was to read the force sensitive resistor on MANOI’s hand (kudos to Krafter for donating the FSR)! This is what the function looks like in Python:
-
def readFSR(arduino):
-
print "MANOI Read FSR"
-
arduino.send(‘*’)
-
arduino.send(‘FSR’)
-
arduino.send(‘*’)
-
return arduino.read(4)
This is how it gets parsed into MANOI’s Arduino brain:
-
if(newByte == ‘*’) {
-
-
byte byteIn = 0;
-
-
// Getting the command details
-
while (byteIn != ‘*’) {
-
byteIn = nextByte();
-
msg[it] = byteIn;
-
it++;
-
}
-
-
// Checking to see if we received the message
-
// and seeing how long it is
-
if(it>0) {
-
receivedMessage = true;
-
messageLength = it-1;
-
//analogWrite(greenR2, 255);
-
}
-
-
if(receivedMessage == true && messageLength == 3) {
-
-
validCmd = true;
-
ii = 0;
-
-
// Check each letter to see if it’s right
-
while(validCmd && ii<messageLength) {
-
if(msg[ii] != fsrCmd[ii]) {
-
validCmd = false;
-
}
-
ii++;
-
}
-
-
// If it is right, do the command
-
if(validCmd) {
-
readFSR(false, true);
-
}
-
-
}
-
}
BTW, this is how we are reading in the Serial data. It’s a pretty fail-safe way of doing it, especially as it is wrapped in the infinite loop. It makes sure that you don’t miss any data!
-
byte nextByte() {
-
-
while(1) {
-
if(Serial.available() > 0) {
-
byte b = Serial.read();
-
return b;
-
}
-
}
-
-
}
It’s pretty cool to see it working! For triggering dance moves, it is a basic command called danceCmd. The user then feeds in some argument that lets the Arduino know which one you want. For these examples, I used the argument BAJNGL. It stands for “Both Arm Jingle”, but saying it phonetically is pretty funny too *bajingle*!
Python:
-
def danceCmd(arduino, args):
-
print "Dance Command"
-
arduino.send(‘%’)
-
arduino.send(args[0]) #bajngl
-
arduino.send(‘%’)
-
#r = arduino.read((7*19) + 3)
-
#print r
-
arduino.flush()
-
arduino.flushInput()
-
return arduino.read(4)
Arduino:
-
// Pre programmed moves command
-
} else if(newByte == ‘%’) {
-
-
byte byteIn = 0;
-
-
// Getting the command details
-
while (byteIn != ‘%’) {
-
byteIn = nextByte();
-
msg[it] = byteIn;
-
it++;
-
}
-
-
// Checking to see if we received the message
-
// and seeing how long it is
-
if(it>0) {
-
receivedMessage = true;
-
messageLength = it-1;
-
}
-
-
if(receivedMessage == true && messageLength == 6) {
-
-
validCmd = true;
-
ii = 0;
-
-
// Check each letter to see if it’s right
-
while(validCmd && ii<messageLength) {
-
if(msg[ii] != bothArmJngl[ii]) {
-
validCmd = false;
-
}
-
ii++;
-
}
-
-
// If it is right, do the command
-
if(validCmd) {
-
Serial << "okay";
-
bothArmJingle(1);
-
Serial.flush();
-
Serial2.flush();
-
}
-
-
}
-
-
}
But here is where the problem starts! Even though the commands that are sent to move the servos on the SSC-32 are attached to Serial2, they still go into the Serial output buffer. This means that when the Python script wants to read four bytes to see if the Arduino responded to the command, it gets the first four bytes of the motion command that are being sent to the SSC-32. It’s confusing because… why would Serial2 be going into just Serial? It’s really weird.
When I try to clear the buffer through Python, it messes up the way the function is handled. In Arduino, you can’t flush the output buffer, only the input buffer. However, I think that you used to be able to flush the output buffer, as I found an excerpt of a book that said that flush had two boolean values fed into it, for input and output. I think it will turn out to be a simple timing process thing for flushing the buffers from Python.
Once I figure that out, I can add on the XBee to MANOI and test it through wireless communication! I also have a ChronoDot that I can add on to MANOI as well, so that it knows what time it is. I kind of destroyed the circuitry for the RoboGlyphs when I tried to use a TLC594 with RGB LEDs. The TLC594 controls the PWM of the LEDs by connecting them to ground. It’s basically reverse of what you normally do. Common cathode RGB LEDs can’t work with this, only common anode.
Once I save up enough moneys to buy an Arduino UNO Mega, then MANOI will receive that, and the RoboGlyphs will receive MANOI’s older Arduino MEGA. The RoboGlyph’s Sanguino can be used for BubbleBoy. That leaves two normal Arduino boards and one Boarduino left to be used for TECHNOROBOT and for the Transmitter and Receiver. The Yoda Rampage Robot already has an on-board Arduino on it.
Here’s the link to the Arduino code:
Here’s the link to the Python code:
Thanks to comm.cslabs’s IRC channel for being to withstand the numerous tests on MANOI and IRC bot. Glad I haven’t crashed it yet!
Here’s a photo of some pretty leaves at sunset being hidden by some technology (a telephone and power pole).


This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. GO OPEN SOURCE!
Friday Night Robotics – Gyro in MANOI’s Back
Friday, June 11th, I originally wanted to work on BubbleBoy and the swashplate, but it seems as though the axels that I bought ages ago were too big. They could only fit in the big servos, but BubbleBoy uses micro servos.

MANOI’s gyro and accelerometer were in need of being more securely mounted, and the area in MANOI’s back is a great place to mount them. You can hardly see them, but the gyro is mounted on the right wall, and the accelerometer is mounted on the back wall. There’s a piece of foam in there to protect them, and keep them more secure.

The Serial Servo Controller (SSC-32) is what is mounted on top of these, and it was previously only attached to MANOI by velcro. Now there’s some wire tied through its waist and through the SSC-32 to hold it in place!

That was about it for that Friday. The readings from the accelerometer and gyro are definitely less jumpy, and MANOI’s center of gravity is moving around less now.
Friday Night Robotics – Wild Thing
This actually wasn’t on a Friday (Friday I was making an iPhone app), but rather Saturday.
Since the Sanguino requires too many female headers (which cost money, and I don’t have any), I decided to switch up to the Arduino MEGA. It fits in the box that is already there, so it is all good.
Originally I thought that the Wave Shield would work on the MEGA, but it turned out that it didn’t. What I ended up doing instead, though was using one of the MEGA’s extra Serial lines to send a command to another Arduino to start playing music (on the Wave Shield).
I used my iHome speaker thing that I bought at Walmart for $20. Pretty good value, and it’s purple.

It was pretty fun. However, I only used the motions that I created a while ago when MANOI’s knees were broken. A blog post is coming shortly about the previous FNR where I fixed the gears
I even attached a wild duck to MANOI’s head for the occasion:

Here is a video, it is not too good:
See, the problem in the video (when I had to shake it) was that the TX line to the SSC was loose. It does this from time to time. Especially after switching boards!
Friday Night Robotics – Code > All theory
Sometimes theory isn’t worth blogging about. This is definitely the case for this FNR.
Instead, I will blog about the code that I use for MANOI! It’s super simple… this allows me to concentrate on harder things!
This is MANOI, in its simplest form:
MANOI <-- 17 servos <-- SSC-32 <-- Sanguino
The SSC-32 is the serial servo controller. It listens for commands at 9600bps, and sends the PWM to the servos accordingly. The Sanguino (an alternative Arduino with an ATmega644) sends these commands to the SSC-32.
Here is what I have at the top of all of my Arduino sketches for MANOI programs:
-
int HOME0 = 1800;
-
int HOME1 = 1500;
-
int HOME2 = 1000;
-
int HOME3 = 1300;
-
int HOME4 = 1300;
-
int HOME5 = 1600;
-
int HOME6 = 1900;
-
int HOME16 = 1550;
-
int HOME17 = 1200;
-
int HOME18 = 900;
-
int HOME19 = 1600;
-
int HOME20 = 1600;
-
int HOME21 = 1500;
-
int HOME22 = 1200;
-
int HOME23 = 1000;
-
int HOME24 = 1580;
-
int HOME25 = 1600;
It’s useful to have as a reference. The way I organized the SSC-32 was to have all of the servos for above the waste from 0-15. Below would be 16-29. There’s a lot more leg motors than there are arm motors
Here is an example of a motion (forward ‘skating’):
-
void forward(int repeat, int theTime) {
-
for(int i=0; i<repeat; i++) {
-
// Frame 1
-
Serial.print("#0 P");
-
Serial.print(HOME0);
-
Serial.print(" #17 P");
-
Serial.print(HOME17);
-
Serial.print(" #19 P");
-
Serial.print(HOME19);
-
Serial.print(" #22 P");
-
Serial.print(HOME22);
-
Serial.print(" #24 P");
-
Serial.print(HOME24);
-
Serial.print(" #3 P");
-
Serial.print(HOME3);
-
Serial.print(" #6 P");
-
Serial.print(HOME6);
-
Serial.print(" #2 P");
-
Serial.print(HOME2);
-
Serial.print(" #5 P");
-
Serial.print(HOME5);
-
Serial.print(" T");
-
Serial.println(theTime);
-
-
delay(theTime+10);
-
-
// Frame 2
-
Serial.print(" #17 P");
-
Serial.print(HOME17-55);
-
Serial.print(" #19 P");
-
Serial.print(HOME19-50);
-
Serial.print(" #22 P");
-
Serial.print(HOME22+45);
-
Serial.print(" #24 P");
-
Serial.print(HOME24+50);
-
Serial.print("#0 P");
-
Serial.print(HOME0 + 150);
-
Serial.print(" #3 P");
-
Serial.print(HOME3 - 300);
-
Serial.print(" #6 P");
-
Serial.print(HOME6 - 300);
-
Serial.print(" #2 P");
-
Serial.print(HOME2 + 100);
-
Serial.print(" #5 P");
-
Serial.print(HOME5 + 100);
-
Serial.print(" T");
-
Serial.println(theTime);
-
-
delay(theTime);
-
-
// Frame 3
-
Serial.print("#0 P");
-
Serial.print(HOME0);
-
Serial.print(" #17 P");
-
Serial.print(HOME17);
-
Serial.print(" #19 P");
-
Serial.print(HOME19);
-
Serial.print(" #22 P");
-
Serial.print(HOME22);
-
Serial.print(" #24 P");
-
Serial.print(HOME24);
-
Serial.print(" #3 P");
-
Serial.print(HOME3);
-
Serial.print(" #6 P");
-
Serial.print(HOME6);
-
Serial.print(" #2 P");
-
Serial.print(HOME2);
-
Serial.print(" #5 P");
-
Serial.print(HOME5);
-
Serial.print(" T");
-
Serial.println(theTime);
-
-
delay(theTime+10);
-
-
// Frame 4
-
Serial.print(" #17 P");
-
Serial.print(HOME17+55);
-
Serial.print(" #19 P");
-
Serial.print(HOME19+50);
-
Serial.print(" #22 P");
-
Serial.print(HOME22-45);
-
Serial.print(" #24 P");
-
Serial.print(HOME24-50);
-
Serial.print("#0 P");
-
Serial.print(HOME0 - 150);
-
Serial.print(" #3 P");
-
Serial.print(HOME3 + 300);
-
Serial.print(" #6 P");
-
Serial.print(HOME6 + 300);
-
Serial.print(" #2 P");
-
Serial.print(HOME2 + 100);
-
Serial.print(" #5 P");
-
Serial.print(HOME5 + 100);
-
Serial.print(" T");
-
Serial.println(theTime);
-
-
delay(theTime);
-
-
}
-
lastMove = 3;
-
}
It looks long, but it actually isn’t. I have numerous Serial.print()s. The main reason behind this is because I still haven’t found a way to do this:
in C.
The forward motion has 4 ‘frames’ in it. Frame 2 and 4 differ in the way that frame 2 is to bring the leg forward, and frame 4 is to bring the leg back. These two frames are joined together by the home position of those servos, frame 1 and 3. It can definitely be said that the motions need to be worked on
The backwards motion looks the same as the forward motion.
It all culminates into the two main Arduino functions:
-
void setup() {
-
Serial.begin(9600);
-
moveServosIndependent(300);
-
delay(1000);
-
}
-
-
void loop() {
-
forward(10, 200);
-
//shoot(0);
-
//forward(5, 500);
-
//shoot(0);
-
//shoot(1);
-
//left(10);
-
//delay(1000);
-
}
moveServosIndependent is a motion that sets all the servos to their home position
All in all, that is what MANOI’s code looks like. Highly unimpressive and super simple!
MANOI’s Last Tune-up (Servos)
The servo extension cables from RobotShop USA arrived sometime! I’m not sure exactly when, because I don’t check my snail mail every day… heh!

Oh yeah… if RobotShop reads my blog… thank you for sending all of the ridiculous amount of styrofoam squiggles. You could have used an insulated envelope, but no… squiggles!
Hahahaha =)
Hopefully this will be MANOI’s last tune-up! Then I will have to start thinking about the battery… RoboGames is quickly approaching!! (Which means I’ll also have to start thinking about fundraising as well! (it won’t be too bad, about 1/2 the price of the Stanford trip I wager!))
One of the main flaws of MANOI was all of there servo connections… it just was not good!
The way I originally laid out the board was that one side would be for the legs, one side would be for the arms. I am still keeping it this way.
This is what it looked like after the leg side was redone:

This is the arm side:

All in all, much more neat. I eliminated the clumsy extension cables that I had before. Look at how much nicer it is!

I am extremely pleased. I used one of the servo extensions for RX and Ground for the SSC-32. This way they won’t keep falling out and bending pins.
In my opinion, there is even room for an Arduino Pro Mini in there now, and MANOI would have hardly any bulk on its back. I did not test the servos yet, nor did I test the skating motions. (I had to go to class) I’m interested to see how the center of gravity changed.
Maybe putting an Arduino pro mini in there would be a good idea…
and just have right-angle headers on it, with jumpers going to the wave shield. I think that would be efficient! Hmm!!
Exciting!
Hockey MANOI – a summary
I made a pretty good summary of Hockey MANOI in this thread at Trossen Robotics forum. I figured I should post it on my blog because it is a good summary
and I broke it down into easy to read parts, so it’s like a whole JOURNEY of awesome!
Hello TRC World!
My project is a hockey playing humanoid.

It uses a MANOI AT01 kit, controlled by an Arduino (with an ATmega328) with a Wave Shield, and a SSC-32.
Humanoids have always been associated with walking or running. This project focuses on a different action for humanoids, skating. The end result of this project yields an interesting vision of the possibilities of skating robots.
Introduction
The idea came around when I was trying to make my humanoid (MANOI AT01) walk. Instead of taking a “big bite”, I decided to take a smaller bite and make it slide its feet. However, I quickly realized that when it slides its feet, it looks exactly like a newbie Canadian hockey player!
A Canadian newbie hockey player begins to skate by almost walking. Although the skater doesn’t go far, he does move forward due to the friction between the blade of the skate and the ice.
When I did notice this, I quickly grabbed some lego to create MANOI’s own version of skates, which are similar to rollerskates. I mounted the lego onto the feet using velcro.
The hockey stick I just found laying around. I had to cut a bit of it off, as it was too tall. I use tape and tie wraps to keep it mounted to MANOI.

Development
Development on this project was mainly trial and error. To get all of the motions correct so they all balance together was critical.
Instead of using the controller board that is usually used to control the MANOI, I did a major transplant and substituted it for the Arduino and SSC-32. This allows me to have much more flexibility in terms of sensing and creating motions. The H2H software was too problematic.
Usually what would happen is I would draw out a motion, on paper, that I would want to create, and I would put it into MANOI. Sometimes I got it first try, other times I didn’t. However, the cool part is that a lot of the motions stemmed from the ideas of other motions.
For instance, in the video of MANOI Skating with music (seen below), the motion where MANOI is running is actually a faster version of the sway motion! That was really surprising.
The development for the Wii nunchuck part of the code was quite easy as I had already established all of the variables and settings of when the nunchuck is tilted left or right, forwards or backwards. Instead of using real numbers for it though, I just defined a “home position” of the nunchuck, and subtracted or added numbers to the accelerometer axis, x y and z.
The music part of the wave shield was quite fun and straight forward. I looked around for the songs, and put them on a SD card which plugs into the wave shield. From there, it was just a simple method call inside of the Arduino.
Once the above developments were done, I wanted to create a version of MANOI that could sense if a ball/puck/object was there. I did this by using LDRs and LEDs.
Rest assured, I would have used IR Sensors if I had any
This was the best alternative I had, though!

On the left side of the sticks the LEDs are in a yellow casing, and on the right side they are in a clear casing. There is some effect on the reading, however their values change precisely the same when an object is in front of the stick.
The black construction paper enclosure around the LDRs was required to direct the reading. Otherwise, the light from the LEDs saturated the reading and no difference was seen when an object was present or not.
I observed the change between the readings of when there was an object present, and when there was not an object present.
From this, I created a simple neuron, where if the input values succeed a predefined threshold, it will perform an action. In this case, the action would be to shoot the object.
I had to tweak the threshold a little to make it work with smaller objects, such as a roll of electrical tape.

In the video below, you will observe that it does work with a roll of electrical tape, a ball, and a spool of lead solder (the LEAD solder isn’t mine, it’s my DAD’s because he can’t use non-lead solder like the rest of us -_-;). The spool is white, which proves that the theory does work, meaning that the light that is reflected from the LEDs back into the same LDR board does not obscure the readings.
Results
Here are the videos that you can look at!
This is the first video, where I was just getting the motions down.
The program is basically a sequence of movements:
- Forward 6 times
- Shoot 3 times
- Backward 6 times
- Shoot 3 times
As you can see, the forward and backward movements both result in MANOI moving backwards. As I later found out, through trial and error, it was due to the Arduino and power cords limiting the movement of MANOI! Once they were mounted properly, it worked much better.
This is the second video, where MANOI is controlled by the Wii nunchuck!
You press Z to shoot, and you hold C and tilt to move it.
MANOI can move forwards, backwards, left, right, and home.
This is there third video, where MANOI is playing a little game of hockey by himself while listening to some music. The song that you first hear is the Hockey Night in Canada theme song!
This is the last video, where MANOI can autonomously decide if he should shoot or not.
(The quality in that video is quite yucky, please check out the video on [URL="http://vimeo.com/2641041?pg=embed&sec=2641041"]vimeo[/URL] if you’d like to see it in better quality)

Conclusion
In conclusion, this project was SO much fun! The only time I didn’t enjoy it was when I was trying to hold MANOI, who was whacking me with its stick, with one hand and trying to type in some code with my other hand.
My favourite part was watching people play with the Wii version of the code. They really enjoyed it!
I also liked making the AI part too, that was pretty fun.
Next Steps
The next steps would include coding a modified version of the Bayes filter algorithm to predict if an object is in front of the stick or not.
More sensors would be fun, like three proximity sensors mounted on the front, left and right. This way MANOI could avoid opponents trying to take the ball off of it.
I would also add two more servos in the leg that would allow rotation. This would then allow me to create a more realistic skating humanoid, where there would actually be a stride.
Perhaps I could also add a camera to the head so that it could track where the ball/puck/object is.
That’s my project, I hope you like it! ^_^
You can see more of everything I mentioned at robotgrrl.com
Friday Night Robotics
Merry Christmas and Happy Holidays to everyone!
Best of all… it’s ROCK EM SOCK EM ROBOTS DAY! (Boxing Day)
Just as a fair warning, if this entry has more bizarre grammar mess-ups than usual, it’s because I ate too many jelly beans, and all I can think of is jelly beans! Robot jelly beans, jelly bean slushie, a meadow of jelly beans, jelly bean snow… *goes on and on* I think in pictures… and all I can think of right now is a DANCING JELLY BEAN ROBOT! Hahaha, joking. (Or am I?) ^_^
I hardly realized it was Friday today, so it doesn’t really feel like a FNR.
Last Friday, although I didn’t blog it, I was working on the LEDs that you’ll see on the stick, and the program! This Friday I tested and twirked the program so I can blog it.
Here is MANOI!

Do you notice something different about the stick?

The stick now has two perf boards on it! These perf boards have three yellow LEDs surrounding a LDR which has black construction paper around it.


The reason why I chose these yellow LEDs was nothing scientific. These were the only ones I had where I could have some consistency across the two boards. The LEDs on the left are inside of a yellow casing. The ones on the right are in a clear casing. There is a little bit of a difference in the readings of the LDRs, but they both work the same.
I would have really liked to do a different version of this but with an IR sensor and a FSR, but, as I mentioned above, these were the only things I had, and they will for sure get the job done!
What happens is the LDRs “spit out” a reading of the amount of light around it. I use the cardboard to ensure it is directed at what we want to be observing. When there is no object between the two LDRs, the reading is very high. Yet, when there is an object between the two, the reading drops a fair amount. This is because the LDR cannot sense the light from the opposite LEDs. I also tested this with a fairly white object (my DAD’s lead solder spool (eeew lead)) and it does work, meaning the reflected light from the LEDs back into the LDR (on the same board) does not obscure it. You can see for yourself in the video below.
I tinkered with the LDRs’ amount that it to create a threshold that will trigger MANOI’s shot. From what I learned at Stanford, this is simply called a neuron. It has input values, and if they meet a certain threshold,it will do something. This is a very primitive form of AI, but big things come in simple steps. =)
Here is a video of MANOI action! Pretend that the roll of tape is a hockey puck… it almost looks the same!
MANOI Hockey Robot AI from RobotGrrl on Vimeo.
It is also on youtube, here.
At the beginning, you see the LEDs flash. This means that the Arduino is soon going to evaluate the LDR levels. It takes five samples from each LDR, one every 500 ms. It then makes an average, which is the baseline used for comparing the LDR value against the threshold.
Yes, I agree, that this can completely become messed up. I will probably implement a markov approach to create (and update) the baseline. However, I’ll probably only do that after I make a modified Bayes algorithm for the AI.
You might have noticed something different about MANOI’s other hand. I’m giving it a gripping claw so that it can grip stuff. It won’t be meant to hold on to anything precious, but it could emphasize an effect here or there.

While I was adding on the boards, there was just not enough room for all of the stuff that I needed… like +5V and -Gnd. I made a thing with headers and inverted headers so I can easily plug it in!

It saves much needed space on the wave shield:

Just to add, today I was using an Arduino with an ATmega328.
There are more pictures that you can look at in this photoset on Flickr!
This project is almost finished! I just will add in an algorithm improving the AI, make more videos… and that’s it! I will continue the project later on, though with a few more things. I’ll add servos that can rotate the leg so I can make the robot actually skate, and many more things that I am still thinking of.
Can you believe that the Trossen Robotics robot contest deadline is really soon? Yikes!! ![]()
I just have to take a few more videos and work out what I will say in my post… what do you think the judges will be looking for? Hopefully it won’t end up like BubbleBoy in crabfu’s competition… x_x
Though, when crabfu was on Daily Planet (I actually saw it on TV (like two months before all of the robot websites started to go crazy over it), not on youtube) he described his robots as having character because you can interact with them through a control pad.
I think that is completely opposite, because then it is just the human expressing their character through a machine. When you don’t have to use a remote, yet the robot still interacts with its environment, that’s when a robot truly has character. :d
Now we know why BubbleBoy obviously lost… He can have his definition, and I’ll have mine.
His works are very interesting though! I never knew you had to start a fire to make a steam thingy move. I figured you would just boil water or something… hahahaha
(I never thought as far as you would need fire to make water boil, though… EPIC NOT-WIN!) XD
I hope you really enjoyed this blog post. It makes a lot more sense now that one can see what the finished robot will look like!
